frivol 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.travis.yml +15 -0
- data/Gemfile +13 -0
- data/LICENSE +1 -1
- data/README.rdoc +58 -38
- data/Rakefile +16 -26
- data/VERSION +1 -1
- data/frivol.gemspec +74 -62
- data/lib/frivol.rb +14 -363
- data/lib/frivol/class_methods.rb +195 -0
- data/lib/frivol/config.rb +39 -0
- data/lib/frivol/functor.rb +37 -0
- data/lib/frivol/helpers.rb +133 -0
- data/lib/frivol/time_extensions.rb +45 -0
- data/test/fake_redis.rb +36 -11
- data/test/helper.rb +16 -11
- data/test/test_buckets.rb +53 -0
- data/test/test_condition.rb +43 -0
- data/test/test_condition_with_counters.rb +90 -0
- data/test/test_counters.rb +72 -0
- data/test/test_else_with_counters.rb +39 -0
- data/test/test_extensions.rb +15 -0
- data/test/test_frivol.rb +96 -388
- data/test/test_frivolize.rb +81 -0
- data/test/test_seeds.rb +53 -0
- data/test/test_threads.rb +15 -0
- metadata +88 -88
- data/.gitignore +0 -21
@@ -0,0 +1,81 @@
|
|
1
|
+
require "#{File.expand_path(File.dirname(__FILE__))}/helper.rb"
|
2
|
+
|
3
|
+
class TestFrivolize < Test::Unit::TestCase
|
4
|
+
def test_frivolize_methods
|
5
|
+
klass = Class.new(TestClass) do
|
6
|
+
class_variable_set :@@count, 0 # Ruby 1.9.2 seems to need this
|
7
|
+
@@count = 0
|
8
|
+
|
9
|
+
# Imagine counting dinosuars takes a long time, what with the need to invent a time machine first and all
|
10
|
+
def dinosaur_count
|
11
|
+
@@count += 1
|
12
|
+
end
|
13
|
+
frivolize :dinosaur_count
|
14
|
+
end
|
15
|
+
|
16
|
+
t = klass.new
|
17
|
+
assert t.methods.include?(ruby_one_eight? ? 'dinosaur_count' : :dinosaur_count)
|
18
|
+
assert t.methods.include?(ruby_one_eight? ? 'frivolized_dinosaur_count' : :frivolized_dinosaur_count)
|
19
|
+
|
20
|
+
assert_equal 1, t.dinosaur_count
|
21
|
+
|
22
|
+
t = klass.new
|
23
|
+
assert_equal 1, t.dinosaur_count # Does not call original method again
|
24
|
+
|
25
|
+
t.delete_storage
|
26
|
+
t = klass.new
|
27
|
+
assert_equal 2, t.dinosaur_count # Calls the original again
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_frivolize_methods_with_expiry_in_a_bucket
|
31
|
+
klass = Class.new(TestClass) do
|
32
|
+
class_variable_set :@@count, 0 # Ruby 1.9.2 seems to need this
|
33
|
+
@@count = 0
|
34
|
+
|
35
|
+
# Imagine counting dinosuars takes a long time, what with the need to invent a time machine first and all
|
36
|
+
def dinosaur_count
|
37
|
+
@@count += 1
|
38
|
+
end
|
39
|
+
frivolize :dinosaur_count, { :bucket => :dinosaurs, :expires_in => -1 }
|
40
|
+
end
|
41
|
+
|
42
|
+
t = klass.new
|
43
|
+
assert_equal 1, t.dinosaur_count
|
44
|
+
assert_equal 1, t.dinosaur_count # Still 10 because it's coming from the class cache
|
45
|
+
|
46
|
+
t = klass.new
|
47
|
+
assert_equal 2, t.dinosaur_count
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_frivolize_methods_with_expiry_as_a_counter
|
51
|
+
klass = Class.new(TestClass) do
|
52
|
+
class_variable_set :@@count, 0 # Ruby 1.9.2 seems to need this
|
53
|
+
@@count = 0
|
54
|
+
|
55
|
+
# Imagine counting dinosuars takes a long time, what with the need to invent a time machine first and all
|
56
|
+
def dinosaur_count
|
57
|
+
@@count += 1
|
58
|
+
end
|
59
|
+
frivolize :dinosaur_count, { :expires_in => -1, :counter => true }
|
60
|
+
end
|
61
|
+
|
62
|
+
t = klass.new
|
63
|
+
assert t.methods.include?(ruby_one_eight? ? 'store_dinosaur_count' : :store_dinosaur_count) # check that the bucket name is the method name
|
64
|
+
|
65
|
+
assert_equal 1, t.dinosaur_count
|
66
|
+
|
67
|
+
t = klass.new # a fresh instance after value expired
|
68
|
+
assert_equal 2, t.dinosaur_count
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_frivolize_with_seed_as_a_counter_for_increment
|
72
|
+
t = Class.new(TestClass) do
|
73
|
+
def bak_baks
|
74
|
+
88_888
|
75
|
+
end
|
76
|
+
frivolize :bak_baks, :counter => true, :seed => Proc.new{ |obj| obj.bak_baks}
|
77
|
+
end.new
|
78
|
+
|
79
|
+
assert_equal 88_888 + 1, t.increment_bak_baks
|
80
|
+
end
|
81
|
+
end
|
data/test/test_seeds.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require "#{File.expand_path(File.dirname(__FILE__))}/helper.rb"
|
2
|
+
|
3
|
+
class TestSeeds < Test::Unit::TestCase
|
4
|
+
def test_use_seed_value_for_initial_value_of_increment
|
5
|
+
t = Class.new(TestClass) do
|
6
|
+
storage_bucket :cached_count, :counter => true, :seed => Proc.new { |obj| obj.tedious_count }
|
7
|
+
|
8
|
+
def tedious_count
|
9
|
+
99_999 # ... bottle of beers on the wall
|
10
|
+
end
|
11
|
+
end.new
|
12
|
+
|
13
|
+
assert_equal t.tedious_count + 1, t.increment_cached_count
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_use_seed_value_for_initial_value_of_increment_by
|
17
|
+
t = Class.new(TestClass) do
|
18
|
+
storage_bucket :cached_count, :counter => true, :seed => Proc.new { |obj| obj.tedious_count }
|
19
|
+
|
20
|
+
def tedious_count
|
21
|
+
99_999 # ... bottle of beers on the wall
|
22
|
+
end
|
23
|
+
end.new
|
24
|
+
|
25
|
+
amount = 2
|
26
|
+
assert_equal t.tedious_count + amount, t.increment_cached_count_by(amount)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_use_seed_value_for_initial_value_of_decrement
|
30
|
+
t = Class.new(TestClass) do
|
31
|
+
storage_bucket :cached_count, :counter => true, :seed => Proc.new { |obj| obj.tedious_count }
|
32
|
+
|
33
|
+
def tedious_count
|
34
|
+
99_999 # ... bottle of beers on the wall
|
35
|
+
end
|
36
|
+
end.new
|
37
|
+
|
38
|
+
assert_equal t.tedious_count - 1, t.decrement_cached_count
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_use_seed_value_for_initial_value_of_decrement_by
|
42
|
+
t = Class.new(TestClass) do
|
43
|
+
storage_bucket :cached_count, :counter => true, :seed => Proc.new { |obj| obj.tedious_count }
|
44
|
+
|
45
|
+
def tedious_count
|
46
|
+
99_999 # ... bottle of beers on the wall
|
47
|
+
end
|
48
|
+
end.new
|
49
|
+
|
50
|
+
amount = 3
|
51
|
+
assert_equal t.tedious_count - amount, t.decrement_cached_count_by(amount)
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require "#{File.expand_path(File.dirname(__FILE__))}/helper.rb"
|
2
|
+
|
3
|
+
class TestThreads < Test::Unit::TestCase
|
4
|
+
def test_each_thread_gets_its_own_connection
|
5
|
+
threads = []
|
6
|
+
2.times do
|
7
|
+
threads << Thread.new do
|
8
|
+
t = TestClass.new
|
9
|
+
t.retrieve :nothing => nil
|
10
|
+
end
|
11
|
+
end
|
12
|
+
threads.each { |thread| thread.join }
|
13
|
+
assert_not_equal threads.first[:frivol_redis], threads.last[:frivol_redis]
|
14
|
+
end
|
15
|
+
end
|
metadata
CHANGED
@@ -1,83 +1,83 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: frivol
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease: false
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 2
|
9
|
-
- 0
|
10
|
-
version: 0.2.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.0
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
13
7
|
- Marc Heiligers
|
14
8
|
autorequire:
|
15
9
|
bindir: bin
|
16
10
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
prerelease: false
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
|
-
requirements:
|
11
|
+
date: 2014-03-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: multi_json
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
27
17
|
- - ">="
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
segments:
|
31
|
-
- 1
|
32
|
-
- 2
|
33
|
-
- 0
|
34
|
-
version: 1.2.0
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
35
20
|
type: :runtime
|
36
|
-
|
37
|
-
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
38
28
|
name: redis
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
39
35
|
prerelease: false
|
40
|
-
|
41
|
-
|
42
|
-
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
43
45
|
- - ">="
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
|
46
|
-
segments:
|
47
|
-
- 2
|
48
|
-
- 0
|
49
|
-
- 10
|
50
|
-
version: 2.0.10
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
51
48
|
type: :runtime
|
52
|
-
version_requirements: *id002
|
53
|
-
- !ruby/object:Gem::Dependency
|
54
|
-
name: shoulda
|
55
49
|
prerelease: false
|
56
|
-
|
57
|
-
|
58
|
-
requirements:
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
59
52
|
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: jeweler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
67
62
|
type: :development
|
68
|
-
|
69
|
-
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: Simple Redis backed temporary storage intended primarily for use with
|
70
|
+
ActiveRecord models to provide caching
|
70
71
|
email: marc@eternal.co.za
|
71
72
|
executables: []
|
72
|
-
|
73
73
|
extensions: []
|
74
|
-
|
75
|
-
extra_rdoc_files:
|
74
|
+
extra_rdoc_files:
|
76
75
|
- LICENSE
|
77
76
|
- README.rdoc
|
78
|
-
files:
|
79
|
-
- .document
|
80
|
-
- .
|
77
|
+
files:
|
78
|
+
- ".document"
|
79
|
+
- ".travis.yml"
|
80
|
+
- Gemfile
|
81
81
|
- LICENSE
|
82
82
|
- README.rdoc
|
83
83
|
- Rakefile
|
@@ -109,44 +109,44 @@ files:
|
|
109
109
|
- doc/rdoc-style.css
|
110
110
|
- frivol.gemspec
|
111
111
|
- lib/frivol.rb
|
112
|
+
- lib/frivol/class_methods.rb
|
113
|
+
- lib/frivol/config.rb
|
114
|
+
- lib/frivol/functor.rb
|
115
|
+
- lib/frivol/helpers.rb
|
116
|
+
- lib/frivol/time_extensions.rb
|
112
117
|
- test/fake_redis.rb
|
113
118
|
- test/helper.rb
|
119
|
+
- test/test_buckets.rb
|
120
|
+
- test/test_condition.rb
|
121
|
+
- test/test_condition_with_counters.rb
|
122
|
+
- test/test_counters.rb
|
123
|
+
- test/test_else_with_counters.rb
|
124
|
+
- test/test_extensions.rb
|
114
125
|
- test/test_frivol.rb
|
115
|
-
|
126
|
+
- test/test_frivolize.rb
|
127
|
+
- test/test_seeds.rb
|
128
|
+
- test/test_threads.rb
|
116
129
|
homepage: http://github.com/marcheiligers/frivol
|
117
130
|
licenses: []
|
118
|
-
|
131
|
+
metadata: {}
|
119
132
|
post_install_message:
|
120
|
-
rdoc_options:
|
121
|
-
|
122
|
-
require_paths:
|
133
|
+
rdoc_options: []
|
134
|
+
require_paths:
|
123
135
|
- lib
|
124
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
125
|
-
|
126
|
-
requirements:
|
136
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
137
|
+
requirements:
|
127
138
|
- - ">="
|
128
|
-
- !ruby/object:Gem::Version
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
version: "0"
|
133
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
134
|
-
none: false
|
135
|
-
requirements:
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: '0'
|
141
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
136
143
|
- - ">="
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
|
139
|
-
segments:
|
140
|
-
- 0
|
141
|
-
version: "0"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
142
146
|
requirements: []
|
143
|
-
|
144
147
|
rubyforge_project:
|
145
|
-
rubygems_version:
|
148
|
+
rubygems_version: 2.2.1
|
146
149
|
signing_key:
|
147
|
-
specification_version:
|
150
|
+
specification_version: 4
|
148
151
|
summary: Simple Redis backed temporary storage
|
149
|
-
test_files:
|
150
|
-
- test/fake_redis.rb
|
151
|
-
- test/helper.rb
|
152
|
-
- test/test_frivol.rb
|
152
|
+
test_files: []
|