familia 0.7.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -32,3 +32,9 @@ class Customer < Storable
32
32
  class_string :message
33
33
  end
34
34
 
35
+ class Limiter < Storable
36
+ include Familia
37
+ index :name
38
+ field :name
39
+ string :counter, :quantize => true, :ttl => 1.hour, :quantize => [10.minutes, '%H:%M', 1302468980]
40
+ end
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
 
@@ -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'
@@ -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 'btoken'
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
- #=> true
12
+ ##=> true
13
13
 
14
14
  ## Familia::SortedSet#members
15
15
  @a.metrics.members
16
- #=> ['metric0', 'metric1', 'metric2', 'metric3', 'metric4']
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
- prerelease:
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: bin
9
+ bindir: exe
11
10
  cert_chain: []
12
-
13
- date: 2011-03-04 00:00:00 -05:00
14
- default_executable:
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
- prerelease: false
19
- requirement: &id001 !ruby/object:Gem::Requirement
20
- none: false
21
- requirements:
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
- requirement: &id002 !ruby/object:Gem::Requirement
31
- none: false
32
- requirements:
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
- requirement: &id003 !ruby/object:Gem::Requirement
42
- none: false
43
- requirements:
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.8.6
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
- version_requirements: *id003
49
- - !ruby/object:Gem::Dependency
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
- requirement: &id004 !ruby/object:Gem::Requirement
53
- none: false
54
- requirements:
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.8.6
83
+ - !ruby/object:Gem::Version
84
+ version: 0.0.5
58
85
  type: :runtime
59
- version_requirements: *id004
60
- description: Organize and store ruby objects in Redis
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
- extra_rdoc_files:
67
- - LICENSE.txt
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.rdoc
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
- has_rdoc: true
93
- homepage: http://github.com/delano/familia
94
- licenses: []
95
-
125
+ homepage: https://github.com/delano/familia
126
+ licenses:
127
+ - MIT
128
+ metadata: {}
96
129
  post_install_message:
97
- rdoc_options:
98
- - --charset=UTF-8
99
- require_paths:
130
+ rdoc_options: []
131
+ require_paths:
100
132
  - lib
101
- required_ruby_version: !ruby/object:Gem::Requirement
102
- none: false
103
- requirements:
133
+ required_ruby_version: !ruby/object:Gem::Requirement
134
+ requirements:
104
135
  - - ">="
105
- - !ruby/object:Gem::Version
106
- version: "0"
107
- required_rubygems_version: !ruby/object:Gem::Requirement
108
- none: false
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: "0"
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: 3
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
-