familia 0.7.0 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/CHANGES.txt +19 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +36 -0
- data/README.md +24 -0
- data/VERSION.yml +2 -2
- data/familia.gemspec +17 -65
- data/lib/familia/core_ext.rb +21 -0
- data/lib/familia/object.rb +106 -71
- data/lib/familia/redisobject.rb +254 -191
- data/lib/familia/test_helpers.rb +6 -0
- data/lib/familia.rb +14 -6
- data/try/10_familia_try.rb +17 -0
- data/try/20_redis_object_try.rb +29 -2
- data/try/21_redis_object_zset_try.rb +3 -3
- metadata +99 -72
- data/README.rdoc +0 -14
- data/Rakefile +0 -70
data/lib/familia/test_helpers.rb
CHANGED
data/lib/familia.rb
CHANGED
@@ -3,6 +3,7 @@ FAMILIA_LIB_HOME = File.expand_path File.dirname(__FILE__) unless defined?(FAMIL
|
|
3
3
|
require 'uri/redis'
|
4
4
|
require 'gibbler'
|
5
5
|
require 'familia/core_ext'
|
6
|
+
require 'multi_json'
|
6
7
|
|
7
8
|
module Familia
|
8
9
|
module VERSION
|
@@ -85,7 +86,9 @@ module Familia
|
|
85
86
|
uri &&= URI.parse uri if String === uri
|
86
87
|
uri ||= Familia.uri
|
87
88
|
conf = uri.conf
|
88
|
-
conf[:thread_safe] = true unless conf.has_key?(:thread_safe)
|
89
|
+
conf[:thread_safe] = "true" unless conf.has_key?(:thread_safe)
|
90
|
+
conf[:thread_safe] = conf[:thread_safe].to_s == "true"
|
91
|
+
conf[:logging] = conf[:logging].to_s == "true"
|
89
92
|
if conf.has_key?(:logging) && conf[:logging].to_s == "true"
|
90
93
|
require 'logger'
|
91
94
|
require 'log4r'
|
@@ -128,6 +131,16 @@ module Familia
|
|
128
131
|
end
|
129
132
|
@apiversion
|
130
133
|
end
|
134
|
+
def now n=Time.now
|
135
|
+
n.utc.to_i
|
136
|
+
end
|
137
|
+
# A quantized timestamp
|
138
|
+
# e.g. 12:32 -> 12:30
|
139
|
+
#
|
140
|
+
def qnow quantum=10.minutes, now=Familia.now
|
141
|
+
rounded = now - (now % quantum)
|
142
|
+
Time.at(rounded).utc.to_i
|
143
|
+
end
|
131
144
|
end
|
132
145
|
|
133
146
|
class Problem < RuntimeError; end
|
@@ -148,11 +161,6 @@ module Familia
|
|
148
161
|
obj.send :include, Gibbler::Complex
|
149
162
|
obj.extend Familia::ClassMethods
|
150
163
|
obj.class_zset :instances, :class => obj, :reference => true
|
151
|
-
# :object is a special redis object because its reserved
|
152
|
-
# for storing the marshaled instance data (e.g. to_json).
|
153
|
-
# When it isn't defined explicitly we define it here b/c
|
154
|
-
# it's assumed to exist in other places (see #save).
|
155
|
-
obj.string :object, :class => obj unless obj.redis_object? :object
|
156
164
|
Familia.classes << obj
|
157
165
|
end
|
158
166
|
|
data/try/10_familia_try.rb
CHANGED
@@ -34,3 +34,20 @@ Bone.list? :owners
|
|
34
34
|
definition = Bone.list :owners
|
35
35
|
definition.klass
|
36
36
|
#=> Familia::List
|
37
|
+
|
38
|
+
## Familia.now
|
39
|
+
Familia.now Time.parse('2011-04-10 20:56:20 UTC').utc
|
40
|
+
#=> 1302468980
|
41
|
+
|
42
|
+
## Familia.qnow
|
43
|
+
Familia.qnow 10.minutes, 1302468980
|
44
|
+
#=> 1302468600
|
45
|
+
|
46
|
+
## Familia::Object.qstamp
|
47
|
+
Limiter.qstamp 10.minutes, '%H:%M', 1302468980
|
48
|
+
#=> '20:50'
|
49
|
+
|
50
|
+
## Familia::Object#qstamp
|
51
|
+
limiter = Limiter.new :request
|
52
|
+
limiter.qstamp 10.minutes, '%H:%M', 1302468980
|
53
|
+
##=> '20:50'
|
data/try/20_redis_object_try.rb
CHANGED
@@ -5,8 +5,8 @@ Familia.apiversion = 'v1'
|
|
5
5
|
|
6
6
|
|
7
7
|
## Redis Objects are unique per instance of a Familia class
|
8
|
-
@a = Bone.new 'atoken'
|
9
|
-
@b = Bone.new '
|
8
|
+
@a = Bone.new 'atoken', :name1
|
9
|
+
@b = Bone.new 'atoken', :name2
|
10
10
|
@a.owners.rediskey == @b.owners.rediskey
|
11
11
|
#=> false
|
12
12
|
|
@@ -15,4 +15,31 @@ Familia.apiversion = 'v1'
|
|
15
15
|
#=> true
|
16
16
|
|
17
17
|
|
18
|
+
## Limiter#qstamp
|
19
|
+
@limiter = Limiter.new :requests
|
20
|
+
@limiter.counter.qstamp 10.minutes, '%H:%M', 1302468980
|
21
|
+
#=> '20:50'
|
18
22
|
|
23
|
+
## Redis Objects can be stored to quantized keys
|
24
|
+
@limiter.counter.rediskey
|
25
|
+
#=> "v1:limiter:requests:counter:20:50"
|
26
|
+
|
27
|
+
## Increment counter
|
28
|
+
@limiter.counter.clear
|
29
|
+
@limiter.counter.increment
|
30
|
+
#=> 1
|
31
|
+
|
32
|
+
## Check ttl
|
33
|
+
@limiter.counter.ttl
|
34
|
+
#=> 3600
|
35
|
+
|
36
|
+
## Check ttl for a different instance
|
37
|
+
## (this exists to make sure options are cloned for each instance)
|
38
|
+
@limiter2 = Limiter.new :requests
|
39
|
+
@limiter2.counter.ttl
|
40
|
+
#=> 3600
|
41
|
+
|
42
|
+
## Check realttl
|
43
|
+
sleep 1
|
44
|
+
@limiter.counter.realttl
|
45
|
+
#=> 3600-1
|
@@ -9,11 +9,11 @@ require 'familia/test_helpers'
|
|
9
9
|
@a.metrics.add 0, :metric0
|
10
10
|
@a.metrics.add 1, :metric1
|
11
11
|
@a.metrics.add 3, :metric3
|
12
|
-
|
12
|
+
##=> true
|
13
13
|
|
14
14
|
## Familia::SortedSet#members
|
15
15
|
@a.metrics.members
|
16
|
-
|
16
|
+
##=> ['metric0', 'metric1', 'metric2', 'metric3', 'metric4']
|
17
17
|
|
18
18
|
## Familia::SortedSet#members
|
19
19
|
@a.metrics.revmembers
|
@@ -63,4 +63,4 @@ require 'familia/test_helpers'
|
|
63
63
|
@a.metrics.members
|
64
64
|
#=> ['metric2']
|
65
65
|
|
66
|
-
@a.metrics.clear
|
66
|
+
@a.metrics.clear
|
metadata
CHANGED
@@ -1,76 +1,109 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: familia
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
version: 0.7.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.9.0
|
6
5
|
platform: ruby
|
7
|
-
authors:
|
6
|
+
authors:
|
8
7
|
- Delano Mandelbaum
|
9
8
|
autorequire:
|
10
|
-
bindir:
|
9
|
+
bindir: exe
|
11
10
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
dependencies:
|
16
|
-
- !ruby/object:Gem::Dependency
|
11
|
+
date: 2024-04-05 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
17
14
|
name: redis
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
- !ruby/object:Gem::Version
|
24
|
-
version: 2.1.0
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 4.8.0
|
25
20
|
type: :runtime
|
26
|
-
version_requirements: *id001
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: uri-redis
|
29
21
|
prerelease: false
|
30
|
-
|
31
|
-
|
32
|
-
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 4.8.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: uri-redis
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.4'
|
33
34
|
- - ">="
|
34
|
-
- !ruby/object:Gem::Version
|
35
|
+
- !ruby/object:Gem::Version
|
35
36
|
version: 0.4.2
|
36
37
|
type: :runtime
|
37
|
-
version_requirements: *id002
|
38
|
-
- !ruby/object:Gem::Dependency
|
39
|
-
name: gibbler
|
40
38
|
prerelease: false
|
41
|
-
|
42
|
-
|
43
|
-
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - "~>"
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0.4'
|
44
44
|
- - ">="
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: 0.
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 0.4.2
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: gibbler
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 1.0.0
|
47
54
|
type: :runtime
|
48
|
-
|
49
|
-
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 1.0.0
|
61
|
+
- !ruby/object:Gem::Dependency
|
50
62
|
name: storable
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 0.10.0
|
68
|
+
type: :runtime
|
51
69
|
prerelease: false
|
52
|
-
|
53
|
-
|
54
|
-
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 0.10.0
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: multi_json
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0.0'
|
55
82
|
- - ">="
|
56
|
-
- !ruby/object:Gem::Version
|
57
|
-
version: 0.
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: 0.0.5
|
58
85
|
type: :runtime
|
59
|
-
|
60
|
-
|
86
|
+
prerelease: false
|
87
|
+
version_requirements: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - "~>"
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0.0'
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: 0.0.5
|
95
|
+
description: 'Familia: Organize and store ruby objects in Redis'
|
61
96
|
email: delano@solutious.com
|
62
97
|
executables: []
|
63
|
-
|
64
98
|
extensions: []
|
65
|
-
|
66
|
-
|
67
|
-
-
|
68
|
-
- README.rdoc
|
69
|
-
files:
|
99
|
+
extra_rdoc_files: []
|
100
|
+
files:
|
101
|
+
- ".gitignore"
|
70
102
|
- CHANGES.txt
|
103
|
+
- Gemfile
|
104
|
+
- Gemfile.lock
|
71
105
|
- LICENSE.txt
|
72
|
-
- README.
|
73
|
-
- Rakefile
|
106
|
+
- README.md
|
74
107
|
- VERSION.yml
|
75
108
|
- familia.gemspec
|
76
109
|
- lib/familia.rb
|
@@ -89,33 +122,27 @@ files:
|
|
89
122
|
- try/24_redis_object_string_try.rb
|
90
123
|
- try/25_redis_object_hash_try.rb
|
91
124
|
- try/30_familia_object_try.rb
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
125
|
+
homepage: https://github.com/delano/familia
|
126
|
+
licenses:
|
127
|
+
- MIT
|
128
|
+
metadata: {}
|
96
129
|
post_install_message:
|
97
|
-
rdoc_options:
|
98
|
-
|
99
|
-
require_paths:
|
130
|
+
rdoc_options: []
|
131
|
+
require_paths:
|
100
132
|
- lib
|
101
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
102
|
-
|
103
|
-
requirements:
|
133
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
104
135
|
- - ">="
|
105
|
-
- !ruby/object:Gem::Version
|
106
|
-
version:
|
107
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
|
-
|
109
|
-
requirements:
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: 2.6.8
|
138
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
139
|
+
requirements:
|
110
140
|
- - ">="
|
111
|
-
- !ruby/object:Gem::Version
|
112
|
-
version:
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '0'
|
113
143
|
requirements: []
|
114
|
-
|
115
|
-
rubyforge_project: familia
|
116
|
-
rubygems_version: 1.5.2
|
144
|
+
rubygems_version: 3.2.3
|
117
145
|
signing_key:
|
118
|
-
specification_version:
|
146
|
+
specification_version: 4
|
119
147
|
summary: Organize and store ruby objects in Redis
|
120
148
|
test_files: []
|
121
|
-
|
data/README.rdoc
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
# Familia - 0.6 BETA
|
2
|
-
|
3
|
-
**Organize and store ruby objects in Redis**
|
4
|
-
|
5
|
-
|
6
|
-
## More Information
|
7
|
-
|
8
|
-
* [Codes](http://github.com/delano/familia)
|
9
|
-
* [RDocs](http://delano.github.com/familia)
|
10
|
-
|
11
|
-
|
12
|
-
## Credits
|
13
|
-
|
14
|
-
* [Delano Mandelbaum](http://goldensword.ca)
|
data/Rakefile
DELETED
@@ -1,70 +0,0 @@
|
|
1
|
-
require "rubygems"
|
2
|
-
require "rake"
|
3
|
-
require "rake/clean"
|
4
|
-
require 'yaml'
|
5
|
-
|
6
|
-
begin
|
7
|
-
require 'hanna/rdoctask'
|
8
|
-
rescue LoadError
|
9
|
-
require 'rake/rdoctask'
|
10
|
-
end
|
11
|
-
|
12
|
-
config = YAML.load_file("VERSION.yml")
|
13
|
-
task :default => ["build"]
|
14
|
-
CLEAN.include [ 'pkg', 'doc' ]
|
15
|
-
name = "familia"
|
16
|
-
|
17
|
-
begin
|
18
|
-
require "jeweler"
|
19
|
-
Jeweler::Tasks.new do |gem|
|
20
|
-
gem.version = "#{config[:MAJOR]}.#{config[:MINOR]}.#{config[:PATCH]}"
|
21
|
-
gem.name = name
|
22
|
-
gem.rubyforge_project = gem.name
|
23
|
-
gem.summary = "Organize and store ruby objects in Redis"
|
24
|
-
gem.description = gem.summary
|
25
|
-
gem.email = "delano@solutious.com"
|
26
|
-
gem.homepage = "http://github.com/delano/familia"
|
27
|
-
gem.authors = ["Delano Mandelbaum"]
|
28
|
-
gem.add_dependency("redis", ">= 2.1.0")
|
29
|
-
gem.add_dependency("uri-redis", ">= 0.4.2")
|
30
|
-
gem.add_dependency("gibbler", ">= 0.8.6")
|
31
|
-
gem.add_dependency("storable", ">= 0.8.6")
|
32
|
-
|
33
|
-
#gem.add_development_dependency("rspec", ">= 1.2.9")
|
34
|
-
#gem.add_development_dependency("mocha", ">= 0.9.8")
|
35
|
-
end
|
36
|
-
Jeweler::GemcutterTasks.new
|
37
|
-
rescue LoadError
|
38
|
-
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
39
|
-
end
|
40
|
-
|
41
|
-
|
42
|
-
Rake::RDocTask.new do |rdoc|
|
43
|
-
version = "#{config[:MAJOR]}.#{config[:MINOR]}.#{config[:PATCH]}"
|
44
|
-
rdoc.rdoc_dir = "doc"
|
45
|
-
rdoc.title = "#{name} #{version}"
|
46
|
-
rdoc.rdoc_files.include("README*")
|
47
|
-
rdoc.rdoc_files.include("LICENSE.txt")
|
48
|
-
rdoc.rdoc_files.include("bin/*.rb")
|
49
|
-
rdoc.rdoc_files.include("lib/**/*.rb")
|
50
|
-
end
|
51
|
-
|
52
|
-
|
53
|
-
# Rubyforge Release / Publish Tasks ==================================
|
54
|
-
|
55
|
-
#about 'Publish website to rubyforge'
|
56
|
-
task 'publish:rdoc' => 'doc/index.html' do
|
57
|
-
#sh "scp -rp doc/* rubyforge.org:/var/www/gforge-projects/#{name}/"
|
58
|
-
end
|
59
|
-
|
60
|
-
#about 'Public release to rubyforge'
|
61
|
-
task 'publish:gem' => [:package] do |t|
|
62
|
-
sh <<-end
|
63
|
-
rubyforge add_release -o Any -a CHANGES.txt -f -n README.md #{name} #{name} #{@spec.version} pkg/#{name}-#{@spec.version}.gem &&
|
64
|
-
rubyforge add_file -o Any -a CHANGES.txt -f -n README.md #{name} #{name} #{@spec.version} pkg/#{name}-#{@spec.version}.tgz
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|