redness 0.0.5 → 0.1.0

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.
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
+ /Gemfile.lock
1
2
  *.gem
2
3
  tmp/*
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile CHANGED
@@ -1,8 +1,2 @@
1
1
  source :rubygems
2
-
3
- gem "rake"
4
- gem "json"
5
- gem "rspec"
6
- gem "redis", "~> 2.2.2"
7
- gem "activesupport"
8
- gem "timecop"
2
+ gemspec
data/lib/redness/red.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'timeout'
2
+
1
3
  class Red
2
4
  class RedisUnavailable < StandardError; end
3
5
 
@@ -5,6 +7,10 @@ class Red
5
7
  $redis
6
8
  end
7
9
 
10
+ def self.client_version
11
+ @version ||= Redis::VERSION.scan(/\d+/).map { |s| s.to_i }
12
+ end
13
+
8
14
  def self.delete(key)
9
15
  redis.del(key)
10
16
  end
@@ -15,7 +21,7 @@ class Red
15
21
 
16
22
  def execute_with_uncertainty(fail_return = [])
17
23
  yield
18
- rescue RedisUnavailable, Errno::ECONNREFUSED, Timeout, Timeout::Error, Errno::EAGAIN
24
+ rescue RedisUnavailable, Redis::CannotConnectError, Errno::ECONNREFUSED, Timeout, Timeout::Error, Errno::EAGAIN
19
25
  fail_return
20
26
  end
21
27
 
@@ -41,6 +41,10 @@ class RedHash
41
41
  end
42
42
  end
43
43
 
44
+ def get(key)
45
+ self[key]
46
+ end
47
+
44
48
  def set(options)
45
49
  redis.execute_with_uncertainty(false) do
46
50
  options.keys.each do |option|
@@ -1,4 +1,6 @@
1
1
  class RedList
2
+ attr_reader :key
3
+
2
4
  def self.redis
3
5
  @redis ||= Red.new
4
6
  end
@@ -47,4 +49,19 @@ class RedList
47
49
  end
48
50
  end
49
51
 
52
+ def initialize(key)
53
+ @key = key
54
+ end
55
+
56
+ def add(value)
57
+ self.class.add(@key, value)
58
+ end
59
+
60
+ def remove(value)
61
+ self.class.remove(@key, value)
62
+ end
63
+
64
+ def value
65
+ self.class.get(@key)
66
+ end
50
67
  end
@@ -1,4 +1,6 @@
1
1
  class RedSet
2
+ attr_reader :key
3
+
2
4
  def self.redis
3
5
  @redis ||= Red.new
4
6
  end
@@ -43,8 +45,14 @@ class RedSet
43
45
  results = redis.zrevrange(key, lower_bound, upper_bound, :with_scores => with_scores)
44
46
  if with_scores
45
47
  [].tap do |memo|
46
- results.each_slice(2) do |slice|
47
- memo << [slice[0].to_i, scoring.call(slice[1].to_i)]
48
+ if Red.client_version.first < 3
49
+ results.each_slice(2) do |slice|
50
+ memo << [slice[0].to_i, scoring.call(slice[1].to_i)]
51
+ end
52
+ else
53
+ results.each do |member, score|
54
+ memo << [member.to_i, scoring.call(score)]
55
+ end
48
56
  end
49
57
  end
50
58
  else
@@ -73,4 +81,20 @@ class RedSet
73
81
  redis.zscore(key, member)
74
82
  end
75
83
  end
84
+
85
+ def initialize(key)
86
+ @key = key
87
+ end
88
+
89
+ def add(value, options = {})
90
+ self.class.add(@key, value, options)
91
+ end
92
+
93
+ def value
94
+ self.class.get(@key)
95
+ end
96
+
97
+ def remove(value)
98
+ self.class.remove(@key, value)
99
+ end
76
100
  end
@@ -1,4 +1,4 @@
1
1
  module Redness
2
- VERSION="0.0.5"
2
+ VERSION="0.1.0"
3
3
  MAJOR, MINOR, TINY = VERSION.split(".")
4
4
  end
data/redness.gemspec CHANGED
@@ -1,5 +1,5 @@
1
1
  $:.push File.expand_path("../lib", __FILE__)
2
- require "version"
2
+ require "redness/version"
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "redness"
@@ -18,10 +18,11 @@ Gem::Specification.new do |s|
18
18
  s.homepage = "http://github.com/howaboutwe/redness"
19
19
  s.licenses = ["MIT"]
20
20
  s.files = `git ls-files`.split("\n")
21
- s.add_dependency "json"
22
- s.add_dependency "rspec"
23
- s.add_dependency "redis", "~> 2.2.2"
24
- s.add_dependency "activesupport"
25
- s.add_dependency "timecop"
21
+ s.add_runtime_dependency "json"
22
+ s.add_runtime_dependency "rspec"
23
+ s.add_runtime_dependency "redis", "~> 3.0.0"
24
+ s.add_runtime_dependency "activesupport"
25
+ s.add_development_dependency "timecop"
26
+ s.add_development_dependency "rake"
26
27
  s.require_paths = ["lib"]
27
28
  end
@@ -75,6 +75,22 @@ describe RedHash do
75
75
  end
76
76
  end
77
77
 
78
+ describe "#get" do
79
+ before do
80
+ red_hash.set(
81
+ key: "foo",
82
+ another: "bar",
83
+ yet_another: "baz"
84
+ )
85
+ end
86
+
87
+ it "is aliased to []" do
88
+ red_hash.should_receive(:[]).with("key").and_return("foo")
89
+
90
+ red_hash.get("key").should == "foo"
91
+ end
92
+ end
93
+
78
94
  describe "#set" do
79
95
  it "accepts a hash, and sets all keys" do
80
96
  red_hash.set(
@@ -1,6 +1,51 @@
1
1
  require 'spec_integration_helper'
2
2
 
3
3
  describe RedList do
4
+ describe "#initialize" do
5
+ it "creates a new RedList instance with the provided key" do
6
+ list = RedList.new("somekey")
7
+
8
+ list.key.should == "somekey"
9
+ end
10
+ end
11
+
12
+ describe "#add" do
13
+ it "adds the element to the list" do
14
+ list = RedList.new("somekey")
15
+
16
+ list.add(1)
17
+
18
+ list.value.should == [1]
19
+ end
20
+ end
21
+
22
+ describe "#remove" do
23
+ it "removes the element from the list" do
24
+ list = RedList.new("somekey")
25
+
26
+ list.add(1)
27
+ list.add(2)
28
+
29
+ list.value.should == [2, 1]
30
+
31
+ list.remove(2)
32
+
33
+ list.value.should == [1]
34
+ end
35
+ end
36
+
37
+ describe "#value" do
38
+ it "returns the vlue of the list" do
39
+ list = RedList.new("somekey")
40
+
41
+ list.value.should == []
42
+
43
+ list.add(1)
44
+
45
+ list.value.should == [1]
46
+ end
47
+ end
48
+
4
49
  describe ".add" do
5
50
  it "adds a member to the list" do
6
51
  RedList.add("somekey", 2)
@@ -1,6 +1,49 @@
1
1
  require 'spec_integration_helper'
2
2
 
3
3
  describe RedSet do
4
+ describe "#initialize" do
5
+ it "creates a new RedSet instance and stores the key" do
6
+ set = RedSet.new("somekey")
7
+
8
+ set.key.should == "somekey"
9
+ end
10
+ end
11
+
12
+ describe "#add" do
13
+ it "adds the given value to the set" do
14
+ set = RedSet.new("somekey")
15
+
16
+ set.add(1)
17
+
18
+ set.value.should == [1]
19
+ end
20
+ end
21
+
22
+ describe "#value" do
23
+ it "returns the RedSet collection" do
24
+ set = RedSet.new("somekey")
25
+ set.value.should == []
26
+
27
+ set.add(1)
28
+
29
+ set.value.should == [1]
30
+ end
31
+ end
32
+
33
+ describe "#remove" do
34
+ it "removes the item from the set" do
35
+ set = RedSet.new("somekey")
36
+ set.add(1)
37
+ set.add(2)
38
+
39
+ set.value.should == [2, 1]
40
+
41
+ set.remove(2)
42
+
43
+ set.value.should == [1]
44
+ end
45
+ end
46
+
4
47
  describe ".add" do
5
48
  it "should add a member to the set" do
6
49
  RedSet.add("somekey", 2)
@@ -31,7 +74,7 @@ describe RedSet do
31
74
  it "sets the score when one is provided" do
32
75
  RedSet.add("somekey", 1, :score => lambda { 1000 })
33
76
 
34
- RedSet.score("somekey", 1).should == "1000"
77
+ RedSet.score("somekey", 1).should == 1000
35
78
  end
36
79
  end
37
80
 
@@ -50,19 +93,33 @@ describe RedSet do
50
93
  it "returns the score of member within key" do
51
94
  RedSet.add("somekey", 1)
52
95
 
53
- RedSet.score("somekey", 1).should == "0"
96
+ RedSet.score("somekey", 1).should == 0
54
97
  end
55
98
  end
56
99
 
57
100
  describe ".get" do
58
- describe "pagination" do
59
- it "should return results bounded by provided options" do
60
- RedSet.add("somekey", 1)
61
- RedSet.add("somekey", 2)
62
-
63
- RedSet.get("somekey", :lower => 0, :upper => 0).should == [2]
64
- RedSet.get("somekey", :lower => 1, :upper => 1).should == [1]
65
- end
101
+ it "should return the elements in reverse-inserted order" do
102
+ RedSet.add('somekey', 1)
103
+ RedSet.add('somekey', 2)
104
+ RedSet.add('somekey', 3)
105
+
106
+ RedSet.get('somekey').should == [3, 2, 1]
107
+ end
108
+
109
+ it "should pair the elements with their scores if :with_scores is true" do
110
+ RedSet.add('somekey', 1)
111
+ RedSet.add('somekey', 2)
112
+ RedSet.add('somekey', 3)
113
+
114
+ RedSet.get('somekey', :with_scores => true).should == [[3, 2], [2, 1], [1, 0]]
115
+ end
116
+
117
+ it "should return results bounded by provided pagination options" do
118
+ RedSet.add("somekey", 1)
119
+ RedSet.add("somekey", 2)
120
+
121
+ RedSet.get("somekey", :lower => 0, :upper => 0).should == [2]
122
+ RedSet.get("somekey", :lower => 1, :upper => 1).should == [1]
66
123
  end
67
124
  end
68
125
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redness
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -14,11 +14,11 @@ authors:
14
14
  autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
- date: 2012-05-04 00:00:00.000000000Z
17
+ date: 2012-08-03 00:00:00.000000000 Z
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
20
20
  name: json
21
- requirement: &70095839355840 !ruby/object:Gem::Requirement
21
+ requirement: !ruby/object:Gem::Requirement
22
22
  none: false
23
23
  requirements:
24
24
  - - ! '>='
@@ -26,10 +26,15 @@ dependencies:
26
26
  version: '0'
27
27
  type: :runtime
28
28
  prerelease: false
29
- version_requirements: *70095839355840
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
30
35
  - !ruby/object:Gem::Dependency
31
36
  name: rspec
32
- requirement: &70095839355420 !ruby/object:Gem::Requirement
37
+ requirement: !ruby/object:Gem::Requirement
33
38
  none: false
34
39
  requirements:
35
40
  - - ! '>='
@@ -37,21 +42,31 @@ dependencies:
37
42
  version: '0'
38
43
  type: :runtime
39
44
  prerelease: false
40
- version_requirements: *70095839355420
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ none: false
47
+ requirements:
48
+ - - ! '>='
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
41
51
  - !ruby/object:Gem::Dependency
42
52
  name: redis
43
- requirement: &70095839354920 !ruby/object:Gem::Requirement
53
+ requirement: !ruby/object:Gem::Requirement
44
54
  none: false
45
55
  requirements:
46
56
  - - ~>
47
57
  - !ruby/object:Gem::Version
48
- version: 2.2.2
58
+ version: 3.0.0
49
59
  type: :runtime
50
60
  prerelease: false
51
- version_requirements: *70095839354920
61
+ version_requirements: !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ~>
65
+ - !ruby/object:Gem::Version
66
+ version: 3.0.0
52
67
  - !ruby/object:Gem::Dependency
53
68
  name: activesupport
54
- requirement: &70095839354500 !ruby/object:Gem::Requirement
69
+ requirement: !ruby/object:Gem::Requirement
55
70
  none: false
56
71
  requirements:
57
72
  - - ! '>='
@@ -59,18 +74,44 @@ dependencies:
59
74
  version: '0'
60
75
  type: :runtime
61
76
  prerelease: false
62
- version_requirements: *70095839354500
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ none: false
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
63
83
  - !ruby/object:Gem::Dependency
64
84
  name: timecop
65
- requirement: &70095839354040 !ruby/object:Gem::Requirement
85
+ requirement: !ruby/object:Gem::Requirement
66
86
  none: false
67
87
  requirements:
68
88
  - - ! '>='
69
89
  - !ruby/object:Gem::Version
70
90
  version: '0'
71
- type: :runtime
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ - !ruby/object:Gem::Dependency
100
+ name: rake
101
+ requirement: !ruby/object:Gem::Requirement
102
+ none: false
103
+ requirements:
104
+ - - ! '>='
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ type: :development
72
108
  prerelease: false
73
- version_requirements: *70095839354040
109
+ version_requirements: !ruby/object:Gem::Requirement
110
+ none: false
111
+ requirements:
112
+ - - ! '>='
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
74
115
  description: Helpful Ruby classes for improved Redis data structures
75
116
  email: dev@howaboutwe.com
76
117
  executables: []
@@ -78,8 +119,8 @@ extensions: []
78
119
  extra_rdoc_files: []
79
120
  files:
80
121
  - .gitignore
122
+ - .rspec
81
123
  - Gemfile
82
- - Gemfile.lock
83
124
  - LICENSE.txt
84
125
  - RAKEFILE
85
126
  - README.md
@@ -96,7 +137,7 @@ files:
96
137
  - lib/redness/red_set_multi.rb
97
138
  - lib/redness/red_set_union.rb
98
139
  - lib/redness/timed_red_set.rb
99
- - lib/version.rb
140
+ - lib/redness/version.rb
100
141
  - redness.gemspec
101
142
  - spec/redis_runner.rb
102
143
  - spec/redness/red_capped_list_spec.rb
@@ -130,8 +171,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
171
  version: '0'
131
172
  requirements: []
132
173
  rubyforge_project:
133
- rubygems_version: 1.8.16
174
+ rubygems_version: 1.8.24
134
175
  signing_key:
135
176
  specification_version: 3
136
177
  summary: Helpful Ruby classes for improved Redis data structures
137
178
  test_files: []
179
+ has_rdoc:
data/Gemfile.lock DELETED
@@ -1,32 +0,0 @@
1
- GEM
2
- remote: http://rubygems.org/
3
- specs:
4
- activesupport (3.2.3)
5
- i18n (~> 0.6)
6
- multi_json (~> 1.0)
7
- diff-lcs (1.1.3)
8
- i18n (0.6.0)
9
- json (1.6.6)
10
- multi_json (1.3.2)
11
- rake (0.9.2.2)
12
- redis (2.2.2)
13
- rspec (2.9.0)
14
- rspec-core (~> 2.9.0)
15
- rspec-expectations (~> 2.9.0)
16
- rspec-mocks (~> 2.9.0)
17
- rspec-core (2.9.0)
18
- rspec-expectations (2.9.1)
19
- diff-lcs (~> 1.1.3)
20
- rspec-mocks (2.9.0)
21
- timecop (0.3.5)
22
-
23
- PLATFORMS
24
- ruby
25
-
26
- DEPENDENCIES
27
- activesupport
28
- json
29
- rake
30
- redis (~> 2.2.2)
31
- rspec
32
- timecop