simple-feed 2.0.2 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/rubocop.yml +33 -0
  3. data/.github/workflows/ruby.yml +35 -0
  4. data/.relaxed-rubocop-2.4.yml +174 -0
  5. data/.rspec +1 -1
  6. data/.rubocop.yml +42 -1149
  7. data/.rubocop_todo.yml +134 -0
  8. data/.travis.yml +15 -8
  9. data/Gemfile +2 -0
  10. data/Guardfile +3 -3
  11. data/{README.md → README.adoc} +205 -140
  12. data/Rakefile +6 -7
  13. data/bin/console +1 -0
  14. data/examples/shared/provider_example.rb +10 -3
  15. data/lib/simple-feed.rb +2 -0
  16. data/lib/simple_feed.rb +2 -0
  17. data/lib/simplefeed.rb +9 -7
  18. data/lib/simplefeed/activity/base.rb +2 -0
  19. data/lib/simplefeed/activity/multi_user.rb +8 -6
  20. data/lib/simplefeed/activity/single_user.rb +5 -4
  21. data/lib/simplefeed/dsl.rb +3 -1
  22. data/lib/simplefeed/dsl/activities.rb +4 -3
  23. data/lib/simplefeed/dsl/formatter.rb +12 -12
  24. data/lib/simplefeed/event.rb +4 -3
  25. data/lib/simplefeed/feed.rb +19 -22
  26. data/lib/simplefeed/key/template.rb +5 -9
  27. data/lib/simplefeed/key/type.rb +4 -2
  28. data/lib/simplefeed/providers.rb +24 -9
  29. data/lib/simplefeed/providers/base/provider.rb +6 -3
  30. data/lib/simplefeed/providers/hash.rb +2 -0
  31. data/lib/simplefeed/providers/hash/paginator.rb +4 -2
  32. data/lib/simplefeed/providers/hash/provider.rb +11 -21
  33. data/lib/simplefeed/providers/key.rb +20 -11
  34. data/lib/simplefeed/providers/proxy.rb +13 -12
  35. data/lib/simplefeed/providers/redis.rb +2 -0
  36. data/lib/simplefeed/providers/redis/driver.rb +23 -23
  37. data/lib/simplefeed/providers/redis/provider.rb +35 -33
  38. data/lib/simplefeed/providers/redis/stats.rb +12 -13
  39. data/lib/simplefeed/response.rb +4 -2
  40. data/lib/simplefeed/version.rb +3 -1
  41. data/simple-feed.gemspec +16 -14
  42. metadata +58 -41
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'redis'
2
4
  require 'base62-rb'
3
5
  require 'forwardable'
@@ -21,7 +23,6 @@ module SimpleFeed
21
23
  # u.afkj234.meta: { total: 2, unread: 2, last_read: 2016-11-20 22:00:34 -08:00 GMT }
22
24
  # ```
23
25
  class Provider < ::SimpleFeed::Providers::Base::Provider
24
-
25
26
  # SimpleFeed::Providers.define_provider_methods(self) do |provider, method, **opts, &block|
26
27
  # users = Users.new(provider: provider, user_ids: opts.delete(:user_ids))
27
28
  # opts.empty? ?
@@ -48,6 +49,7 @@ module SimpleFeed
48
49
 
49
50
  def delete_if(user_ids:)
50
51
  raise ArgumentError, '#delete_if must be called with a block that receives (user_id, event) as arguments.' unless block_given?
52
+
51
53
  with_response_batched(user_ids) do |key|
52
54
  fetch(user_ids: [key.user_id])[key.user_id].map do |event|
53
55
  with_redis do |redis|
@@ -129,7 +131,7 @@ module SimpleFeed
129
131
  end
130
132
  end
131
133
 
132
- FEED_METHODS = %i(total_memory_bytes total_users last_disk_save_time)
134
+ FEED_METHODS = %i(total_memory_bytes total_users last_disk_save_time).freeze
133
135
 
134
136
  def total_memory_bytes
135
137
  with_stats(:used_memory_since_boot)
@@ -147,39 +149,39 @@ module SimpleFeed
147
149
 
148
150
  def transform_response(user_id = nil, result)
149
151
  case result
150
- when ::Redis::Future
151
- transform_response(user_id, result.value)
152
+ when ::Redis::Future
153
+ transform_response(user_id, result.value)
152
154
 
153
- when ::Hash
155
+ when ::Hash
154
156
 
155
- if result.values.any? { |v| transformable_type?(v) }
156
- result.each { |k, v| result[k] = transform_response(user_id, v) }
157
- else
158
- result
159
- end
157
+ if result.values.any? { |v| transformable_type?(v) }
158
+ result.each { |k, v| result[k] = transform_response(user_id, v) }
159
+ else
160
+ result
161
+ end
160
162
 
161
- when ::Array
163
+ when ::Array
162
164
 
163
- if result.any? { |v| transformable_type?(v) }
164
- result = result.map { |v| transform_response(user_id, v) }
165
- end
165
+ if result.any? { |v| transformable_type?(v) }
166
+ result = result.map { |v| transform_response(user_id, v) }
167
+ end
166
168
 
167
- if result.size == 2 && result[1].is_a?(Float)
168
- SimpleFeed::Event.new(value: result[0], at: Time.at(result[1]))
169
- else
170
- result
171
- end
169
+ if result.size == 2 && result[1].is_a?(Float)
170
+ SimpleFeed::Event.new(value: result[0], at: Time.at(result[1]))
171
+ else
172
+ result
173
+ end
172
174
 
173
- when ::String
174
- if result =~ /^\d+\.\d+$/
175
- result.to_f
176
- elsif result =~ /^\d+$/
177
- result.to_i
178
- else
179
- result
180
- end
175
+ when ::String
176
+ if result =~ /^\d+\.\d+$/
177
+ result.to_f
178
+ elsif result =~ /^\d+$/
179
+ result.to_i
181
180
  else
182
181
  result
182
+ end
183
+ else
184
+ result
183
185
  end
184
186
  end
185
187
 
@@ -194,9 +196,9 @@ module SimpleFeed
194
196
 
195
197
  private
196
198
 
197
- #——————————————————————————————————————————————————————————————————————————————————————
199
+ # ——————————————————————————————————————————————————————————————————————————————————————
198
200
  # helpers
199
- #——————————————————————————————————————————————————————————————————————————————————————
201
+ # ——————————————————————————————————————————————————————————————————————————————————————
200
202
 
201
203
  def reset_users_last_read(redis, key, time = nil)
202
204
  time = time.nil? ? Time.now.to_f : time.to_f
@@ -214,9 +216,9 @@ module SimpleFeed
214
216
  redis.zrevrange(key.data, (page - 1) * per_page, page * per_page - 1, withscores: true)
215
217
  end
216
218
 
217
- #——————————————————————————————————————————————————————————————————————————————————————
219
+ # ——————————————————————————————————————————————————————————————————————————————————————
218
220
  # Operations with response
219
- #——————————————————————————————————————————————————————————————————————————————————————
221
+ # ——————————————————————————————————————————————————————————————————————————————————————
220
222
 
221
223
  def with_response_pipelined(user_ids, response = nil)
222
224
  with_response(response) do |response|
@@ -234,9 +236,9 @@ module SimpleFeed
234
236
  end
235
237
  end
236
238
 
237
- #——————————————————————————————————————————————————————————————————————————————————————
239
+ # ——————————————————————————————————————————————————————————————————————————————————————
238
240
  # Batch operations
239
- #——————————————————————————————————————————————————————————————————————————————————————
241
+ # ——————————————————————————————————————————————————————————————————————————————————————
240
242
  def batch_pipelined(user_ids)
241
243
  to_array(user_ids).each_slice(batch_size) do |batch|
242
244
  with_pipelined do |redis|
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'redis'
2
4
  require 'hashie/mash'
3
5
  require 'yaml'
@@ -6,7 +8,6 @@ module SimpleFeed
6
8
  module Providers
7
9
  module Redis
8
10
  class Stats
9
-
10
11
  attr_accessor :redis
11
12
 
12
13
  def initialize(redis)
@@ -56,27 +57,25 @@ module SimpleFeed
56
57
  end
57
58
 
58
59
  def load_boot_stats!
59
- @boot_info ||= destringify(YAML.load(File.open(File.expand_path('../boot_info.yml', __FILE__))))
60
+ @boot_info ||= destringify(YAML.load(File.open(File.expand_path('boot_info.yml', __dir__))))
60
61
  end
61
-
62
62
  end
63
63
 
64
64
  load_boot_stats!
65
65
 
66
66
  boot_info.keys.each do |key|
67
- unless key.to_s =~ /^db[0-9]+/
67
+ next if key.to_s =~ /^db[0-9]+/
68
68
 
69
- define_method(key.to_sym) do
70
- info[key]
71
- end
69
+ define_method(key.to_sym) do
70
+ info[key]
71
+ end
72
72
 
73
- define_method("#{key}_at_boot".to_sym) do
74
- boot_info[key]
75
- end
73
+ define_method("#{key}_at_boot".to_sym) do
74
+ boot_info[key]
75
+ end
76
76
 
77
- define_method("#{key}_since_boot".to_sym) do
78
- info[key] - boot_info[key]
79
- end
77
+ define_method("#{key}_since_boot".to_sym) do
78
+ info[key] - boot_info[key]
80
79
  end
81
80
  end
82
81
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'hashie'
2
4
  require 'forwardable'
3
5
  require 'simplefeed'
@@ -29,7 +31,7 @@ module SimpleFeed
29
31
  key_or_user_id.user_id :
30
32
  key_or_user_id
31
33
 
32
- @result[user_id] = result ? result : yield(@result[user_id])
34
+ @result[user_id] = result || yield(@result[user_id])
33
35
  end
34
36
 
35
37
  def user_ids
@@ -61,7 +63,7 @@ module SimpleFeed
61
63
  end
62
64
 
63
65
  def result(user_id = nil)
64
- if user_id then
66
+ if user_id
65
67
  @result[user_id]
66
68
  else
67
69
  if @result.values.size == 1
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SimpleFeed
2
- VERSION = '2.0.2'
4
+ VERSION = '2.1.0'
3
5
  end
@@ -1,5 +1,6 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'simplefeed/version'
5
6
 
@@ -9,8 +10,8 @@ Gem::Specification.new do |spec|
9
10
  spec.authors = ['Konstantin Gredeskoul']
10
11
  spec.email = ['kigster@gmail.com']
11
12
 
12
- spec.summary = %q{Create multiple types of social networking activity feeds with simple-feed gem, which uses a pluggable backend provider implementation, and ships with a Redis provider by default.}
13
- spec.description = %q{This gem implements flexible time-ordered activity feeds commonly used withing social networking applications. As events occur, they are pushed into the Feed and distributed to all users that need to see the event. Upon the user visiting their "feed page", a pre-populated ordered list of events is returned by the library. Typically the data stored in the feed is a short-hand condensed variant of models, but it can also be a fully Marshalled objects, or JSON serializations. }
13
+ spec.summary = 'Create multiple types of social networking activity feeds with simple-feed gem, which uses a pluggable backend provider implementation, and ships with a Redis provider by default.'
14
+ spec.description = 'This gem implements flexible time-ordered activity feeds commonly used withing social networking applications. As events occur, they are pushed into the Feed and distributed to all users that need to see the event. Upon the user visiting their "feed page", a pre-populated ordered list of events is returned by the library. Typically the data stored in the feed is a short-hand condensed variant of models, but it can also be a fully Marshalled objects, or JSON serializations. '
14
15
  spec.homepage = 'https://github.com/kigster/simple-feed'
15
16
  spec.license = 'MIT'
16
17
 
@@ -22,21 +23,22 @@ Gem::Specification.new do |spec|
22
23
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
24
  spec.require_paths = ['lib']
24
25
 
26
+ spec.add_dependency 'activesupport'
25
27
  spec.add_dependency 'base62-rb'
28
+ spec.add_dependency 'colored2'
29
+ spec.add_dependency 'connection_pool', '~> 2'
30
+ spec.add_dependency 'hashie'
26
31
  spec.add_dependency 'hiredis'
27
32
  spec.add_dependency 'redis'
28
- spec.add_dependency 'hashie'
29
- spec.add_dependency 'connection_pool', '~> 2'
30
- spec.add_dependency 'activesupport'
31
- spec.add_dependency 'colored2'
32
33
 
33
34
  spec.add_development_dependency 'awesome_print'
34
- spec.add_development_dependency 'yard'
35
- spec.add_development_dependency 'simplecov', '~> 0.12'
36
- spec.add_development_dependency 'codeclimate-test-reporter', '~> 1.0'
37
- spec.add_development_dependency 'knjrbfw'
38
35
  spec.add_development_dependency 'bundler'
39
- spec.add_development_dependency 'rake', '~> 10.0'
40
- spec.add_development_dependency 'rspec', '~> 3.5'
36
+ spec.add_development_dependency 'codeclimate-test-reporter'
37
+ spec.add_development_dependency 'rake'
38
+ spec.add_development_dependency 'rspec'
41
39
  spec.add_development_dependency 'rspec-its'
40
+ spec.add_development_dependency 'rubocop'
41
+ spec.add_development_dependency 'simplecov'
42
+ spec.add_development_dependency 'uuid'
43
+ spec.add_development_dependency 'yard'
42
44
  end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple-feed
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Konstantin Gredeskoul
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-12-07 00:00:00.000000000 Z
11
+ date: 2020-05-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: base62-rb
14
+ name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: hiredis
28
+ name: base62-rb
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: redis
42
+ name: colored2
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: connection_pool
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: hashie
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -67,21 +81,21 @@ dependencies:
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
- name: connection_pool
84
+ name: hiredis
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - "~>"
87
+ - - ">="
74
88
  - !ruby/object:Gem::Version
75
- version: '2'
89
+ version: '0'
76
90
  type: :runtime
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - "~>"
94
+ - - ">="
81
95
  - !ruby/object:Gem::Version
82
- version: '2'
96
+ version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
- name: activesupport
98
+ name: redis
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - ">="
@@ -95,13 +109,13 @@ dependencies:
95
109
  - !ruby/object:Gem::Version
96
110
  version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
- name: colored2
112
+ name: awesome_print
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
115
  - - ">="
102
116
  - !ruby/object:Gem::Version
103
117
  version: '0'
104
- type: :runtime
118
+ type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
@@ -109,7 +123,7 @@ dependencies:
109
123
  - !ruby/object:Gem::Version
110
124
  version: '0'
111
125
  - !ruby/object:Gem::Dependency
112
- name: awesome_print
126
+ name: bundler
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
129
  - - ">="
@@ -123,7 +137,7 @@ dependencies:
123
137
  - !ruby/object:Gem::Version
124
138
  version: '0'
125
139
  - !ruby/object:Gem::Dependency
126
- name: yard
140
+ name: codeclimate-test-reporter
127
141
  requirement: !ruby/object:Gem::Requirement
128
142
  requirements:
129
143
  - - ">="
@@ -137,35 +151,35 @@ dependencies:
137
151
  - !ruby/object:Gem::Version
138
152
  version: '0'
139
153
  - !ruby/object:Gem::Dependency
140
- name: simplecov
154
+ name: rake
141
155
  requirement: !ruby/object:Gem::Requirement
142
156
  requirements:
143
- - - "~>"
157
+ - - ">="
144
158
  - !ruby/object:Gem::Version
145
- version: '0.12'
159
+ version: '0'
146
160
  type: :development
147
161
  prerelease: false
148
162
  version_requirements: !ruby/object:Gem::Requirement
149
163
  requirements:
150
- - - "~>"
164
+ - - ">="
151
165
  - !ruby/object:Gem::Version
152
- version: '0.12'
166
+ version: '0'
153
167
  - !ruby/object:Gem::Dependency
154
- name: codeclimate-test-reporter
168
+ name: rspec
155
169
  requirement: !ruby/object:Gem::Requirement
156
170
  requirements:
157
- - - "~>"
171
+ - - ">="
158
172
  - !ruby/object:Gem::Version
159
- version: '1.0'
173
+ version: '0'
160
174
  type: :development
161
175
  prerelease: false
162
176
  version_requirements: !ruby/object:Gem::Requirement
163
177
  requirements:
164
- - - "~>"
178
+ - - ">="
165
179
  - !ruby/object:Gem::Version
166
- version: '1.0'
180
+ version: '0'
167
181
  - !ruby/object:Gem::Dependency
168
- name: knjrbfw
182
+ name: rspec-its
169
183
  requirement: !ruby/object:Gem::Requirement
170
184
  requirements:
171
185
  - - ">="
@@ -179,7 +193,7 @@ dependencies:
179
193
  - !ruby/object:Gem::Version
180
194
  version: '0'
181
195
  - !ruby/object:Gem::Dependency
182
- name: bundler
196
+ name: rubocop
183
197
  requirement: !ruby/object:Gem::Requirement
184
198
  requirements:
185
199
  - - ">="
@@ -193,35 +207,35 @@ dependencies:
193
207
  - !ruby/object:Gem::Version
194
208
  version: '0'
195
209
  - !ruby/object:Gem::Dependency
196
- name: rake
210
+ name: simplecov
197
211
  requirement: !ruby/object:Gem::Requirement
198
212
  requirements:
199
- - - "~>"
213
+ - - ">="
200
214
  - !ruby/object:Gem::Version
201
- version: '10.0'
215
+ version: '0'
202
216
  type: :development
203
217
  prerelease: false
204
218
  version_requirements: !ruby/object:Gem::Requirement
205
219
  requirements:
206
- - - "~>"
220
+ - - ">="
207
221
  - !ruby/object:Gem::Version
208
- version: '10.0'
222
+ version: '0'
209
223
  - !ruby/object:Gem::Dependency
210
- name: rspec
224
+ name: uuid
211
225
  requirement: !ruby/object:Gem::Requirement
212
226
  requirements:
213
- - - "~>"
227
+ - - ">="
214
228
  - !ruby/object:Gem::Version
215
- version: '3.5'
229
+ version: '0'
216
230
  type: :development
217
231
  prerelease: false
218
232
  version_requirements: !ruby/object:Gem::Requirement
219
233
  requirements:
220
- - - "~>"
234
+ - - ">="
221
235
  - !ruby/object:Gem::Version
222
- version: '3.5'
236
+ version: '0'
223
237
  - !ruby/object:Gem::Dependency
224
- name: rspec-its
238
+ name: yard
225
239
  requirement: !ruby/object:Gem::Requirement
226
240
  requirements:
227
241
  - - ">="
@@ -247,15 +261,19 @@ extensions: []
247
261
  extra_rdoc_files: []
248
262
  files:
249
263
  - ".codeclimate.yml"
264
+ - ".github/workflows/rubocop.yml"
265
+ - ".github/workflows/ruby.yml"
250
266
  - ".gitignore"
267
+ - ".relaxed-rubocop-2.4.yml"
251
268
  - ".rspec"
252
269
  - ".rubocop.yml"
270
+ - ".rubocop_todo.yml"
253
271
  - ".travis.yml"
254
272
  - ".yardopts"
255
273
  - Gemfile
256
274
  - Guardfile
257
275
  - LICENSE.txt
258
- - README.md
276
+ - README.adoc
259
277
  - Rakefile
260
278
  - bin/console
261
279
  - bin/setup
@@ -313,8 +331,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
313
331
  - !ruby/object:Gem::Version
314
332
  version: '0'
315
333
  requirements: []
316
- rubyforge_project:
317
- rubygems_version: 2.6.13
334
+ rubygems_version: 3.1.3
318
335
  signing_key:
319
336
  specification_version: 4
320
337
  summary: Create multiple types of social networking activity feeds with simple-feed