collectr 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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