lists_by_days_redis 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.
Files changed (4) hide show
  1. checksums.yaml +15 -0
  2. data/README.md +6 -0
  3. data/lib/lists.rb +223 -0
  4. metadata +45 -0
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MmE1ZjQ2NmNjNWIzMTczMThiMjA5MDU1Y2E2OGM2NGYwN2E5MDI0MA==
5
+ data.tar.gz: !binary |-
6
+ ZGNkZDE5OWU5YzlmNWZmYTQzNmZkYjM4ZjM3Mjc5MWMyNTY1ZjczNg==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ ZGMyNWI5ZWYwNDgyNzk2MzJkMDg0MDk0OTNmZGQxNDEwZTgzMzM5NWU4MjFl
10
+ YjI1ZjBiNjU1MjZlMjVlYjJkODUyMjRkYzRmYTcxNGRkYzk2MjMyZDExMTA3
11
+ MmZiYTBkMmYxOWRiZGY2MjdmMTk0OWJmNzZiNGRlMDViOWMzOTQ=
12
+ data.tar.gz: !binary |-
13
+ OGM3MDM4NzdkNGM1ZmViMDQ3YTk4Nzg0MjNhMTk3MTExNjRlNzA1YmYxN2Nh
14
+ YmQ2OTRkY2QxYWIzNDVkM2FmZDRmYTU3MDk4MjI0NWI1ODczYWU3MTk5ZDU0
15
+ ZTk1ZjI4MDQzODY4MzNkYTY4MDEzZjVjNzg0MzIxMmY4MmQ2ZGI=
@@ -0,0 +1,6 @@
1
+ Lists by Days in Redis Gem
2
+ ==========
3
+
4
+ Simple gem to store custom data in lists by days in Redis.
5
+ Old data is automatically removed.
6
+ Useful for debugging and tracking different events in application.
@@ -0,0 +1,223 @@
1
+ module ListsByDaysRedis
2
+
3
+ require 'redis'
4
+
5
+ class List
6
+ # static data
7
+ #PROCESSES = ['effects']
8
+ SITE_NAME = ''
9
+
10
+ EXPIRE_DAYS = 7
11
+
12
+
13
+ @@redis = nil
14
+
15
+ # redis object to access Redis server
16
+ def self.redis
17
+ return @@redis unless @redis.nil?
18
+
19
+ # init by global object
20
+ unless $redis.nil?
21
+ @@redis = $redis
22
+ return @@redis
23
+ end
24
+
25
+
26
+ # default
27
+ @@redis = Redis.new(:host => 'localhost', :port => 6379)
28
+
29
+ @@redis
30
+ end
31
+
32
+ # methods for any log_type add_<<ANY_LOG_TYPE>>
33
+ def self.method_missing(method_name, *args, &block)
34
+ if method_name.to_s =~ /^add_(.+)$/
35
+ self.add($1, *args)
36
+ else
37
+ super
38
+ end
39
+ end
40
+
41
+
42
+ # generic method
43
+
44
+ def self.add(list_name, data={})
45
+ t = Time.now.utc.to_i
46
+ rkey = self.redis_key_list list_name
47
+
48
+ #
49
+ hash = {:created=>t}
50
+ if data.is_a?(Hash)
51
+ data.each_pair { |k,v| hash["#{k}"] = v }
52
+ elsif data.is_a?(String)
53
+ hash["msg"] = data
54
+ else
55
+ hash["msg"] = "#{data.inspect}"
56
+ end
57
+
58
+ #
59
+ require 'json'
60
+ s = JSON.generate(hash)
61
+
62
+ redis.rpush rkey, s
63
+ redis.expireat rkey, t+EXPIRE_DAYS*24*60*60
64
+
65
+ return true
66
+ end
67
+
68
+
69
+ #
70
+ def self.add_debug(event_name, msg='', fields={})
71
+ fields['msg'] = msg
72
+ fields['event'] = event_name
73
+ return self.add 'debug', fields
74
+ end
75
+
76
+
77
+
78
+ def self.get_all(list_name, days_back=1, filter={})
79
+ all_keys = redis.keys(self.redis_key_list(list_name)+'*')
80
+
81
+ return [] if all_keys.nil?
82
+
83
+ tnow = Time.now.utc.to_i
84
+ rows = []
85
+ all_keys.each do |rkey|
86
+ day = self.parse_date_for_key rkey
87
+
88
+ # if cannot parse key
89
+ next if day.nil?
90
+
91
+ # if not too old day
92
+ next if tnow - day.to_i > days_back * (60*60*24)
93
+
94
+
95
+ # get all items from the list
96
+ values = redis.lrange rkey, 0, 100000
97
+
98
+ values.each do |v|
99
+ r = Marshal.load v
100
+
101
+ # filter
102
+ is_good = true
103
+ unless filter.nil? && filter.is_a?(Hash)
104
+ filter.each_pair do |field_name, field_value|
105
+ next if r[field_name].nil?
106
+ if r[field_name] != field_value
107
+ is_good = false
108
+ break
109
+ end
110
+ end
111
+ end
112
+
113
+ # add to result
114
+ if is_good
115
+ rows << r
116
+ end
117
+ end
118
+
119
+ end
120
+
121
+ rows
122
+ end
123
+
124
+
125
+
126
+
127
+
128
+ # status
129
+ def self.set_status(event_name, site_name=nil)
130
+ tnow = Time.now.utc.to_i
131
+
132
+ redis.hset(self.redis_key_status, event_name, tnow)
133
+ end
134
+
135
+
136
+ def self.get_statuses(event_pattern, site_name=nil)
137
+ # event_names like 'name*'
138
+
139
+ rows = []
140
+
141
+ all_values = redis.hgetall(self.redis_key_status)
142
+
143
+ all_values.each do |type_name, v|
144
+ rows << {:log_type=>type_name, :site=>site_name, :v_type=>'date', :v=>v.to_i}
145
+ end
146
+
147
+ rows
148
+ end
149
+
150
+
151
+ # counters ??
152
+ def self.add_stat(counter_name, amount=1)
153
+ redis.hincrby(self.redis_key_stats, counter_name, amount)
154
+ return true
155
+ end
156
+
157
+
158
+ # performance counter
159
+ def self.add_perf_time(counter_name, duration_secs)
160
+ rkey = self.redis_key_stats
161
+
162
+ redis.hincrby(rkey, counter_name+'_time', (duration_secs*1000).floor)
163
+ redis.hincrby(rkey, counter_name+'_n', 1)
164
+
165
+ return true
166
+ end
167
+
168
+
169
+ # helper methods
170
+
171
+ def self.redis_key_prefix
172
+ "#{SITE_NAME=='' ? '' : SITE_NAME+':'}"
173
+ end
174
+
175
+ def self.redis_key_list_prefix(name)
176
+ self.redis_key_prefix + "lists:#{name}:"
177
+ end
178
+
179
+ def self.key_day(d=nil)
180
+ d ||= DateTime.now.new_offset(0)
181
+
182
+ d.strftime("%Y%m%d")
183
+ end
184
+
185
+ def self.redis_key_list(name)
186
+ self.redis_key_list_prefix(name) + self.key_day
187
+ end
188
+
189
+
190
+ def self.parse_date_for_key(key)
191
+ # parse key
192
+ mm = key.scan(/:(\d\d\d\d)(\d\d)(\d\d)$/i)
193
+
194
+ return nil if mm.nil? || mm[0].nil?
195
+
196
+ y, m, d = mm[0].map{|v| v.to_i}
197
+
198
+ Time.utc(y,m,d)
199
+ end
200
+
201
+
202
+
203
+ # redis methods
204
+
205
+ def self.redis_clear_lists_all
206
+ keys = redis.keys(redis_key_prefix+'lists:*')
207
+ return if keys.empty?
208
+ redis.del keys
209
+ end
210
+
211
+ def self.redis_clear_list(name)
212
+ keys = redis.keys(redis_key_list_prefix(name)+"*")
213
+ return if keys.empty?
214
+ redis.del keys
215
+ end
216
+
217
+
218
+ end
219
+
220
+
221
+ end
222
+
223
+
metadata ADDED
@@ -0,0 +1,45 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lists_by_days_redis
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - ! 'Max Ivak '
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-04-07 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Useful for debugging and tracking different events in application.
14
+ email:
15
+ - maxivak@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/lists.rb
21
+ - README.md
22
+ homepage: https://github.com/maxivak/lists_by_days_redis/
23
+ licenses: []
24
+ metadata: {}
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ requirements: []
40
+ rubyforge_project:
41
+ rubygems_version: 2.0.3
42
+ signing_key:
43
+ specification_version: 4
44
+ summary: Simple library to store custom data in lists by days in Redis
45
+ test_files: []