collectr 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c36a0989de82c34e5d3616e9d6a38b208c7cc83c
4
+ data.tar.gz: fcabb5daf05f39371e7870b8bfe0f66f17567ea0
5
+ SHA512:
6
+ metadata.gz: 63609dc1ae2c21a08fae5e26ca4fd36e86841743210ad1ca913fd0689431941523e45f4e169415915755cb2a628b51a74cfb45755c576bf360111efd2d5b404a
7
+ data.tar.gz: 675a5ea618c06a55381adc26261e2ce5085fc730cc8f51b142f17bdde74a4e2cfb1100f8f8ebc66ee5cc29ace27573664eb966f3134e1cb199c6f96462e3bcb9
data/.coveralls.yml ADDED
@@ -0,0 +1 @@
1
+ service_name: travis-ci
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/.travis.yml ADDED
@@ -0,0 +1,17 @@
1
+ language: ruby
2
+ cache: bundler
3
+
4
+ rvm:
5
+ - jruby
6
+ - 2.0.0
7
+ - 2.1.5
8
+ - 2.2.0
9
+
10
+ script: 'bundle exec rake'
11
+
12
+ notifications:
13
+ email:
14
+ recipients:
15
+ - brian@murphydye.com
16
+ on_failure: change
17
+ on_success: never
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in collectr.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,11 @@
1
+ guard :rspec, cmd: 'bundle exec rspec' do
2
+ # watch /lib/ files
3
+ watch(%r{^lib/(.+).rb$}) do |m|
4
+ "spec/#{m[1]}_spec.rb"
5
+ end
6
+
7
+ # watch /spec/ files
8
+ watch(%r{^spec/(.+).rb$}) do |m|
9
+ "spec/#{m[1]}.rb"
10
+ end
11
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Brian Murphy-Dye
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # Collectr
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'collectr'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install collectr
20
+
21
+ ## Usage
22
+
23
+ TODO: Write usage instructions here
24
+
25
+ ## Contributing
26
+
27
+ 1. Fork it ( https://github.com/[my-github-username]/collectr/fork )
28
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
29
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
30
+ 4. Push to the branch (`git push origin my-new-feature`)
31
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require 'rspec/core/rake_task'
2
+ require 'bundler/gem_tasks'
3
+
4
+ # Default directory to look within is `/specs`
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task :default => :spec
data/collectr.gemspec ADDED
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'collectr/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "collectr"
8
+ spec.version = Collectr::VERSION
9
+ spec.authors = ["Brian Murphy-Dye"]
10
+ spec.email = ["brian@murphydye.com"]
11
+ spec.summary = %q{Abstraction thread-safe collections (array, hash, set, bag).}
12
+ spec.description = %q{}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.7"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency 'rspec'
24
+ spec.add_development_dependency "rspec-nc"
25
+ spec.add_development_dependency "guard"
26
+ spec.add_development_dependency "guard-rspec"
27
+ spec.add_development_dependency "pry"
28
+ spec.add_development_dependency "pry-remote"
29
+ spec.add_development_dependency "pry-nav"
30
+ spec.add_development_dependency "coveralls"
31
+ spec.add_development_dependency "redis"
32
+ spec.add_development_dependency "thread_safe"
33
+ spec.add_development_dependency "rspec-its"
34
+ end
data/lib/bag.rb ADDED
@@ -0,0 +1,56 @@
1
+ class Bag
2
+ include Enumerable
3
+
4
+ def initialize(collection=nil)
5
+ @bag = Hash.new{ 0 }
6
+ collection.each{ |item| self << item } if collection
7
+ end
8
+
9
+ def add(obj)
10
+ @bag[obj] += 1
11
+ self
12
+ end
13
+
14
+ def <<(obj)
15
+ add(obj)
16
+ end
17
+
18
+ def [](obj)
19
+ @bag[obj]
20
+ end
21
+
22
+ def keys
23
+ @bag.keys
24
+ end
25
+
26
+ def size
27
+ @bag.size
28
+ end
29
+
30
+ def count
31
+ sum = 0
32
+ each{ |key, val| sum += val }
33
+ sum
34
+ end
35
+
36
+ def each(&block)
37
+ @bag.each{ |k,v| block.call k,v }
38
+ end
39
+
40
+ def bag
41
+ @bag
42
+ end
43
+
44
+ def empty?
45
+ @bag.empty?
46
+ end
47
+
48
+ def as_sorted_counts
49
+ @bag.sort_by{ |key, cnt| cnt }
50
+ end
51
+
52
+ def initialize_copy(source)
53
+ @bag = source.bag.clone
54
+ super
55
+ end
56
+ end
@@ -0,0 +1,3 @@
1
+ module Collectr
2
+ VERSION = "0.0.1"
3
+ end
data/lib/collectr.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "collectr/version"
2
+
3
+ module Collectr
4
+ # Your code goes here...
5
+ end
@@ -0,0 +1,22 @@
1
+ class MemoryFactory
2
+ def initialize(redis_store=nil)
3
+ end
4
+
5
+ def hash(title=default_title, options={})
6
+ MemoryHash.new title, options
7
+ end
8
+
9
+ def set(title=default_title)
10
+ RedisSet.new title, store: @store
11
+ end
12
+
13
+ def array(title=default_title)
14
+ RedisArray.new title, store: @store
15
+ end
16
+
17
+ private
18
+
19
+ def default_title
20
+ Time.now.to_s
21
+ end
22
+ end
@@ -0,0 +1,62 @@
1
+ require 'thread_safe'
2
+
3
+ module Collectr
4
+ class MemoryHash
5
+ attr_reader :store
6
+
7
+ def initialize(name, options={})
8
+ @title = name
9
+ @store ||= ThreadSafe::Hash.new
10
+ end
11
+
12
+ def [](key)
13
+ @store[key]
14
+ end
15
+
16
+ def []=(key, val)
17
+ @store[key] = val
18
+ end
19
+
20
+ def fetch(key, &block)
21
+ @store.fetch(key, &block)
22
+ # @store.fetch(key) do
23
+ # block_given? ? yield(key) : nil
24
+ # end
25
+ end
26
+
27
+ def destroy
28
+ @store ||= ThreadSafe::Hash.new
29
+ end
30
+
31
+ def delete(key)
32
+ @store.delete key
33
+ end
34
+
35
+ def empty?
36
+ @store.empty?
37
+ end
38
+
39
+ def size
40
+ @store.size
41
+ end
42
+
43
+ def has_key?(key)
44
+ key? key
45
+ end
46
+ def key?(key)
47
+ @store.has_key? key
48
+ end
49
+
50
+ def keys
51
+ @store.keys
52
+ end
53
+
54
+ def to_hash
55
+ @store #.copy
56
+ end
57
+
58
+ def clear
59
+ @store.clear
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,48 @@
1
+ module Collection
2
+ class NullHash
3
+ attr_reader :store
4
+
5
+ def initialize(name, options={})
6
+ @title = name
7
+ end
8
+
9
+ def [](key)
10
+ end
11
+
12
+ def []=(key, val)
13
+ end
14
+
15
+ def fetch(key)
16
+ yield(key) if block_given?
17
+ end
18
+
19
+ def delete(key)
20
+ end
21
+
22
+ def empty?
23
+ true
24
+ end
25
+
26
+ def size
27
+ 0
28
+ end
29
+
30
+ def has_key?(key)
31
+ false
32
+ end
33
+ def key?(key)
34
+ false
35
+ end
36
+
37
+ def keys
38
+ []
39
+ end
40
+
41
+ def to_hash
42
+ {}
43
+ end
44
+
45
+ def clear
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,55 @@
1
+ require 'redis'
2
+ require 'json'
3
+
4
+ require_relative 'redis_base'
5
+
6
+ module Collectr
7
+ class RedisArray < RedisBase
8
+ def initialize(name, options={})
9
+ @title = name
10
+ @max_size = options[:max_size] if options.has_key?(:max_size)
11
+ @datastore = options[:datastore] if options.has_key?(:datastore)
12
+ end
13
+
14
+ def datastore
15
+ @datastore ||= Redis.current
16
+ end
17
+
18
+ def <<(obj)
19
+ add obj
20
+ end
21
+
22
+ def add(obj)
23
+ datastore.rpush @title, serialize(obj)
24
+ len = size
25
+ if @max_size and len>@max_size
26
+ datastore.ltrim @title, len-@max_size, -1
27
+ end
28
+ end
29
+
30
+ def [](n)
31
+ deserialize(datastore.lindex @title, n)
32
+ end
33
+
34
+ def pop
35
+ deserialize(datastore.lpop @title)
36
+ end
37
+
38
+ def delete(obj)
39
+ datastore.lrem @title, 0, serialize(obj)
40
+ end
41
+
42
+ def size
43
+ datastore.llen @title
44
+ end
45
+
46
+ def to_a
47
+ datastore.lrange(@title, 0, -1).collect{ |i| deserialize(i) }
48
+ end
49
+
50
+ def clear
51
+ datastore.ltrim @title, 0, 0
52
+ datastore.lpop @title
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,11 @@
1
+ class RedisBase
2
+ def serialize(val)
3
+ @raw ? val : [val].to_json
4
+ end
5
+
6
+ def deserialize(val)
7
+ @raw ? val : JSON.parse(val)[0]
8
+ rescue
9
+ val
10
+ end
11
+ end
@@ -0,0 +1,26 @@
1
+ module Collectr
2
+ class RedisFactory
3
+ def initialize(redis_store=nil)
4
+ @store = redis_store || Redis.current
5
+ end
6
+
7
+ def hash(title=default_title, options={})
8
+ options = { store: @store }.merge options
9
+ # RedisHash.new title, store: @store, *options
10
+ end
11
+
12
+ def set(title=default_title)
13
+ RedisSet.new title, store: @store
14
+ end
15
+
16
+ def array(title=default_title)
17
+ RedisArray.new title, store: @store
18
+ end
19
+
20
+ private
21
+
22
+ def default_title
23
+ Time.now.to_s
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,107 @@
1
+ require 'redis'
2
+ require 'json'
3
+
4
+ require_relative 'redis_base'
5
+
6
+ # __FILE__.has_spec 'common/spec/classes/collection/hash_spec'
7
+
8
+
9
+ # class Redis
10
+ # def fetch(key, options={})
11
+ # val = self[key]
12
+ # if val.nil?
13
+ # begin
14
+ # val = yield key
15
+ # self[key] = val
16
+ # end
17
+ # end
18
+ # val
19
+ # end
20
+ # end
21
+
22
+
23
+ module Collectr
24
+ class RedisHash < RedisBase
25
+ attr_reader :store
26
+
27
+ def initialize(name, options={})
28
+ @title = name
29
+ # Use raw only when both the keys and values are strings.
30
+ @raw = options.fetch(:raw) { false }
31
+ @store = Redis.current
32
+ @expires_in = options[:expires_in]
33
+ end
34
+
35
+ def [](key)
36
+ deserialize @store.hget(@title, serialize(key))
37
+ end
38
+
39
+ def []=(key, val)
40
+ @store.hset @title, serialize(key), serialize(val)
41
+ end
42
+
43
+ def fetch(key, options={})
44
+ result = self[key]
45
+ if result.nil?
46
+ return nil if has_key?(key)
47
+ if block_given?
48
+ result = yield key
49
+ else
50
+ raise KeyError
51
+ end
52
+ end
53
+ result
54
+ end
55
+
56
+ def cache(key, options={})
57
+ result = self[key]
58
+ if result.nil? and block_given?
59
+ result = yield key
60
+ self[key] = result
61
+ else
62
+ raise KeyError
63
+ end
64
+ result
65
+ end
66
+
67
+ def destroy
68
+ @store.del @title
69
+ end
70
+
71
+ def delete(key)
72
+ @store.hdel @title, serialize(key)
73
+ end
74
+
75
+ def empty?
76
+ size == 0
77
+ end
78
+
79
+ def size
80
+ @store.hlen @title
81
+ end
82
+
83
+ def has_key?(key)
84
+ key? key
85
+ end
86
+ def key?(key)
87
+ @store.hexists @title, serialize(key)
88
+ end
89
+
90
+ def keys
91
+ @store.hkeys(@title).collect{ |key| deserialize key }
92
+ end
93
+
94
+ def to_hash
95
+ hash = {}
96
+ @store.hgetall(@title).each do |key, val|
97
+ hash[deserialize(key)] = deserialize(val)
98
+ end
99
+ hash
100
+ end
101
+
102
+ def clear
103
+ destroy
104
+ # keys.each{ |key| delete key }
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,34 @@
1
+ require 'redis'
2
+ require 'json'
3
+
4
+ module Collectr
5
+ class RedisSet
6
+ def initialize(name)
7
+ @title = name
8
+ end
9
+
10
+ def datastore
11
+ @datastore ||= Redis.current
12
+ end
13
+
14
+ def add(obj)
15
+ datastore.sadd @title, obj
16
+ end
17
+
18
+ def delete(obj)
19
+ datastore.srem @title, obj
20
+ end
21
+
22
+ def includes?(obj)
23
+ datastore.sismember @title, obj
24
+ end
25
+
26
+ def to_a
27
+ datastore.smembers @title
28
+ end
29
+
30
+ def clear
31
+ to_a.each{ |obj| delete obj }
32
+ end
33
+ end
34
+ end
data/spec/bag_spec.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+ require 'bag'
3
+
4
+ describe Bag do
5
+ subject(:bag) { Bag.new }
6
+
7
+ it 'handles repetitions' do
8
+ bag << 1 << 1 << 2 << 1 << 'a'
9
+ expect(bag.keys).to eq([1,2,'a'])
10
+ end
11
+
12
+ it 'handles #each' do
13
+ bag << 1 << 1 << 2 << 1 << 'a'
14
+ hash = {}
15
+ bag.each{ |key,val| hash[key] = val }
16
+ expect(hash).to eq({1=>3, 2=>1, 'a'=>1})
17
+ end
18
+ end
data/spec/hash_spec.rb ADDED
@@ -0,0 +1,76 @@
1
+ require 'json'
2
+ require 'spec_helper'
3
+
4
+ require 'redis/redis_hash.rb'
5
+ require 'memory/memory_hash.rb'
6
+
7
+ shared_examples 'a hash' do
8
+ context 'when keys and/or values may be other than strings' do
9
+ subject(:collection) { described_class.new 'example' }
10
+ before { collection.destroy }
11
+ after { collection.clear }
12
+ context 'when newly created' do
13
+ before { collection.clear }
14
+ it { is_expected.to be_empty }
15
+ end
16
+
17
+ context 'after an item is added' do
18
+ before { collection.clear ; collection[1] = 'a1' }
19
+ it { expect(collection.size).to eq(1) }
20
+ it { expect(collection[1]).to eq('a1') }
21
+ end
22
+
23
+ context 'after multiple items are added' do
24
+ before { collection.clear ; collection[1] = 'aa1' ; collection['b2'] = nil ; collection[[1,2]] = 3 }
25
+
26
+ its(:size) { should eq(3) }
27
+ its(:keys) { should eq([1, 'b2', [1,2]]) }
28
+ its(:to_hash) { should eq({1=>'aa1', 'b2'=>nil, [1,2]=>3}) }
29
+ it { expect(collection.fetch(1)).to eq('aa1') }
30
+ it { expect(collection.fetch('b2')).to eq(nil) }
31
+ it { expect(collection.fetch('asdf') { 22 }).to eq(22) }
32
+ it 'raises error when key does not exists' do
33
+ expect{ collection.fetch(9) }.to raise_error(KeyError)
34
+ end
35
+ end
36
+ end
37
+
38
+ context 'when raw hash' do
39
+ subject(:collection) { described_class.new 'example', raw: true }
40
+ before { collection.destroy ; collection['1'] = 'a1' ; collection['b2'] = '2'; collection['[1,2]'] = '3' }
41
+ after { collection.clear }
42
+ its(:size) { should eq(3) }
43
+ its(:keys) { should eq(['1', 'b2', '[1,2]'])}
44
+ its(:to_hash) { should eq({'1'=>'a1', 'b2'=>'2', '[1,2]'=>'3'}) }
45
+ # it { expect(collection.size).to eq(3) }
46
+ it { expect(collection.keys).to eq(['1', 'b2', '[1,2]'])}
47
+ it { expect(collection.to_hash).to eq({'1'=>'a1', 'b2'=>'2', '[1,2]'=>'3'}) }
48
+ end
49
+
50
+ context 'handles nil values' do
51
+ subject(:collection) { described_class.new 'example' }
52
+ before { collection['a'] = nil ; collection[:x] = 5 ; collection['x'] = 7 }
53
+
54
+ it 'handles nil values' do expect(collection.fetch('a')).to be_nil end
55
+ # todo: symbols and strings are the same in redis, so need to fix this
56
+ # it 'symbol key is distinct from string key' do expect(collection.fetch(:x)).to eq(5) end
57
+ # it 'string key is distinct from symbol key' do expect(collection.fetch('x')).to eq(7) end
58
+ it 'new value is retained' do collection['x'] = 9 ; expect(collection.fetch('x')).to eq(9) end
59
+ end
60
+
61
+ # context 'when expires' do
62
+ # it 'expires on time'
63
+ # end
64
+ end
65
+
66
+ if Redis.current
67
+ describe Collectr::RedisHash do
68
+ it_behaves_like 'a hash'
69
+ end
70
+ end
71
+
72
+ # warn Redis.current.flushall
73
+
74
+ describe Collectr::MemoryHash do
75
+ it_behaves_like 'a hash'
76
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ require 'redis/redis_array'
4
+
5
+ describe Collectr::RedisArray do
6
+ subject(:array) { coll = Collectr::RedisArray.new('arr', max_size: 3); coll.clear; coll }
7
+
8
+ it 'keeps only the last three' do
9
+ array << 1
10
+ array << 2
11
+ array << 3
12
+ array << 4
13
+ array << 5
14
+ expect(array.to_a).to eq([3,4,5])
15
+ end
16
+ end
@@ -0,0 +1,9 @@
1
+ require 'coveralls'
2
+ Coveralls.wear!
3
+
4
+ require 'rspec/its'
5
+
6
+ require 'pry'
7
+ require 'collectr'
8
+
9
+ include Collectr
metadata ADDED
@@ -0,0 +1,254 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: collectr
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Brian Murphy-Dye
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-07-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec-nc
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: guard
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: guard-rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry-remote
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: pry-nav
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: coveralls
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: redis
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: thread_safe
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: rspec-its
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ description: ''
196
+ email:
197
+ - brian@murphydye.com
198
+ executables: []
199
+ extensions: []
200
+ extra_rdoc_files: []
201
+ files:
202
+ - ".coveralls.yml"
203
+ - ".gitignore"
204
+ - ".travis.yml"
205
+ - Gemfile
206
+ - Guardfile
207
+ - LICENSE.txt
208
+ - README.md
209
+ - Rakefile
210
+ - collectr.gemspec
211
+ - lib/bag.rb
212
+ - lib/collectr.rb
213
+ - lib/collectr/version.rb
214
+ - lib/memory/memory_factory.rb
215
+ - lib/memory/memory_hash.rb
216
+ - lib/null/null_hash.rb
217
+ - lib/redis/redis_array.rb
218
+ - lib/redis/redis_base.rb
219
+ - lib/redis/redis_factory.rb
220
+ - lib/redis/redis_hash.rb
221
+ - lib/redis/redis_set.rb
222
+ - spec/bag_spec.rb
223
+ - spec/hash_spec.rb
224
+ - spec/redis/redis_array_spec.rb
225
+ - spec/spec_helper.rb
226
+ homepage: ''
227
+ licenses:
228
+ - MIT
229
+ metadata: {}
230
+ post_install_message:
231
+ rdoc_options: []
232
+ require_paths:
233
+ - lib
234
+ required_ruby_version: !ruby/object:Gem::Requirement
235
+ requirements:
236
+ - - ">="
237
+ - !ruby/object:Gem::Version
238
+ version: '0'
239
+ required_rubygems_version: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ requirements: []
245
+ rubyforge_project:
246
+ rubygems_version: 2.4.8
247
+ signing_key:
248
+ specification_version: 4
249
+ summary: Abstraction thread-safe collections (array, hash, set, bag).
250
+ test_files:
251
+ - spec/bag_spec.rb
252
+ - spec/hash_spec.rb
253
+ - spec/redis/redis_array_spec.rb
254
+ - spec/spec_helper.rb