simple-feed 2.1.0 → 3.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.envrc +3 -0
- data/.github/workflows/rubocop.yml +20 -20
- data/.github/workflows/ruby.yml +19 -20
- data/.gitignore +2 -1
- data/.rubocop.yml +1 -1
- data/.rubocop_todo.yml +102 -33
- data/.travis.yml +3 -13
- data/CHANGELOG.md +120 -0
- data/Gemfile +2 -0
- data/README.adoc +197 -76
- data/Rakefile +1 -1
- data/codecov.yml +28 -0
- data/examples/shared/provider_example.rb +43 -25
- data/lib/simplefeed/activity/single_user.rb +2 -2
- data/lib/simplefeed/dsl/formatter.rb +67 -28
- data/lib/simplefeed/event.rb +48 -10
- data/lib/simplefeed/feed.rb +20 -9
- data/lib/simplefeed/providers/base/provider.rb +1 -1
- data/lib/simplefeed/providers/key.rb +57 -42
- data/lib/simplefeed/providers/proxy.rb +20 -7
- data/lib/simplefeed/providers/redis/driver.rb +2 -4
- data/lib/simplefeed/providers/redis/provider.rb +6 -6
- data/lib/simplefeed/providers.rb +0 -1
- data/lib/simplefeed/response.rb +3 -5
- data/lib/simplefeed/version.rb +1 -1
- data/lib/simplefeed.rb +20 -16
- data/man/running-example-redis-debug.png +0 -0
- data/man/running-example.png +0 -0
- data/man/sf-color-dump.png +0 -0
- data/simple-feed.gemspec +7 -2
- metadata +67 -13
- data/examples/hash_provider_example.rb +0 -24
- data/lib/simplefeed/key/template.rb +0 -48
- data/lib/simplefeed/key/type.rb +0 -28
- data/lib/simplefeed/providers/hash/paginator.rb +0 -33
- data/lib/simplefeed/providers/hash/provider.rb +0 -188
@@ -1,8 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'tty-box'
|
4
|
+
require 'tty-screen'
|
3
5
|
require 'simplefeed/dsl'
|
4
6
|
require 'simplefeed/activity/single_user'
|
5
7
|
require 'simplefeed/activity/multi_user'
|
8
|
+
require 'awesome_print'
|
9
|
+
|
6
10
|
module SimpleFeed
|
7
11
|
module DSL
|
8
12
|
# This module exports method #color_dump which receives an activity and
|
@@ -18,40 +22,43 @@ module SimpleFeed
|
|
18
22
|
this_activity.feed.activity([this_activity.user_id])
|
19
23
|
else
|
20
24
|
this_activity
|
21
|
-
|
25
|
+
end
|
22
26
|
_puts
|
23
27
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
+
feed_header(feed) do
|
29
|
+
[
|
30
|
+
field('Feed Name', feed.name, "\n"),
|
31
|
+
field('Provider', feed.provider.provider.class, "\n"),
|
32
|
+
field('Max Size', feed.max_size, "\n")
|
33
|
+
]
|
28
34
|
end
|
29
35
|
|
30
36
|
with_activity(this_activity) do
|
31
|
-
this_activity.
|
37
|
+
this_activity.each_with_index do |user_id, index|
|
32
38
|
this_last_event_at = nil
|
33
39
|
this_last_read = (last_read[user_id] || 0.0).to_f
|
34
40
|
|
41
|
+
fields = []
|
35
42
|
[['User ID', user_id, "\n"],
|
36
43
|
['Activities', sprintf('%d total, %d unread', total_count[user_id], unread_count[user_id]), "\n"],
|
37
44
|
['Last Read', this_last_read ? Time.at(this_last_read) : 'N/A'],].each do |field, value, *args|
|
38
|
-
field(field, value, *args)
|
45
|
+
fields << field(field, value, *args)
|
39
46
|
end
|
40
47
|
|
41
|
-
|
48
|
+
header(title: { top_center: " « User Activity #{index + 1} » " }, style: { fg: :green }) { fields }
|
42
49
|
|
43
50
|
this_events = fetch[user_id]
|
44
51
|
this_events_count = this_events.size
|
45
|
-
this_events.each_with_index do |
|
46
|
-
if this_last_event_at.nil? &&
|
52
|
+
this_events.each_with_index do |evt, idx|
|
53
|
+
if this_last_event_at.nil? && evt.at < this_last_read
|
47
54
|
print_last_read_separator(this_last_read)
|
48
|
-
elsif this_last_event_at && this_last_read < this_last_event_at && this_last_read >
|
55
|
+
elsif this_last_event_at && this_last_read < this_last_event_at && this_last_read > evt.at
|
49
56
|
print_last_read_separator(this_last_read)
|
50
57
|
end
|
51
58
|
|
52
|
-
this_last_event_at =
|
53
|
-
|
54
|
-
if
|
59
|
+
this_last_event_at = evt.at # float
|
60
|
+
output "[%2d] %16s %s\n", idx, evt.time.strftime(TIME_FORMAT).blue.bold, evt.value
|
61
|
+
if idx == this_events_count - 1 && this_last_read < evt.at
|
55
62
|
print_last_read_separator(this_last_read)
|
56
63
|
end
|
57
64
|
end
|
@@ -60,17 +67,18 @@ module SimpleFeed
|
|
60
67
|
end
|
61
68
|
|
62
69
|
def print_last_read_separator(lr)
|
63
|
-
|
70
|
+
output "———— %16s [last read] ———————————— \n", Time.at(lr).strftime(TIME_FORMAT).red.bold
|
64
71
|
end
|
65
72
|
end
|
66
73
|
|
74
|
+
# This allows redirecting output in tests.
|
67
75
|
@print_method = :printf
|
68
76
|
|
69
77
|
class << self
|
70
78
|
attr_accessor :print_method
|
71
79
|
end
|
72
80
|
|
73
|
-
def
|
81
|
+
def output(*args, **opts, &block)
|
74
82
|
send(SimpleFeed::DSL.print_method, *args, **opts, &block)
|
75
83
|
end
|
76
84
|
|
@@ -82,8 +90,6 @@ module SimpleFeed
|
|
82
90
|
sprintf ' %20s ', text
|
83
91
|
end
|
84
92
|
|
85
|
-
TIME_FORMAT = '%Y-%m-%d %H:%M:%S.%L'
|
86
|
-
|
87
93
|
def field_value(value)
|
88
94
|
case value
|
89
95
|
when Numeric
|
@@ -95,22 +101,55 @@ module SimpleFeed
|
|
95
101
|
end
|
96
102
|
end
|
97
103
|
|
98
|
-
def field(label, value,
|
99
|
-
|
104
|
+
def field(label, value, _sep = '')
|
105
|
+
field_label(label) + ' ❯ ' + field_value(value)
|
106
|
+
end
|
107
|
+
|
108
|
+
def hr
|
109
|
+
output hr_string.magenta
|
110
|
+
end
|
111
|
+
|
112
|
+
def hr_string
|
113
|
+
'―' * width + "\n"
|
114
|
+
end
|
115
|
+
|
116
|
+
def width
|
117
|
+
@width ||= [[TTY::Screen.width - 5, 60].max, 75].min
|
100
118
|
end
|
101
119
|
|
102
|
-
def
|
103
|
-
|
120
|
+
def feed_header(feed, &block)
|
121
|
+
header title: { top_left: " « #{feed.name.capitalize} Feed » " },
|
122
|
+
border: :thick,
|
123
|
+
style: {
|
124
|
+
fg: :black,
|
125
|
+
bg: :green,
|
126
|
+
border: { fg: :bright_black, bg: :green }
|
127
|
+
}, &block
|
104
128
|
end
|
105
129
|
|
106
|
-
def
|
107
|
-
|
130
|
+
def header(*args, **opts)
|
131
|
+
message = args.join("\n")
|
132
|
+
msg = block_given? ? (yield || message) : message + "\n"
|
133
|
+
config = box_config(**opts)
|
134
|
+
lines = Array(msg).flatten
|
135
|
+
box = TTY::Box.frame(*lines, **config)
|
136
|
+
output "\n#{box}"
|
108
137
|
end
|
109
138
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
139
|
+
private
|
140
|
+
|
141
|
+
def box_config(**opts)
|
142
|
+
{
|
143
|
+
width: width,
|
144
|
+
align: :left,
|
145
|
+
padding: [1, 3],
|
146
|
+
style: {
|
147
|
+
fg: :bright_yellow,
|
148
|
+
border: {
|
149
|
+
fg: :bright_magenta,
|
150
|
+
}
|
151
|
+
}
|
152
|
+
}.merge(opts)
|
114
153
|
end
|
115
154
|
end
|
116
155
|
end
|
data/lib/simplefeed/event.rb
CHANGED
@@ -5,8 +5,24 @@ require 'json'
|
|
5
5
|
module SimpleFeed
|
6
6
|
class Event
|
7
7
|
attr_accessor :value, :at
|
8
|
+
|
8
9
|
include Comparable
|
9
10
|
|
11
|
+
class << self
|
12
|
+
attr_accessor :is_time
|
13
|
+
end
|
14
|
+
|
15
|
+
# This proc can be overridden in a configuration if needed.
|
16
|
+
# @example To always assume this is time, set it like so,
|
17
|
+
# before defining your feeds.
|
18
|
+
#
|
19
|
+
# SimpleFeed::Event.is_time = ->(*) { true }
|
20
|
+
#
|
21
|
+
self.is_time = ->(float) {
|
22
|
+
# assume it's time if epoch is > June 1974 and < December 2040.
|
23
|
+
float < 2_237_932_800.0 && float > 139_276_800.0
|
24
|
+
}
|
25
|
+
|
10
26
|
def initialize(*args, value: nil, at: Time.now)
|
11
27
|
if args && !args.empty?
|
12
28
|
self.value = args[0]
|
@@ -22,7 +38,11 @@ module SimpleFeed
|
|
22
38
|
end
|
23
39
|
|
24
40
|
def time
|
41
|
+
return nil unless Event.is_time[at]
|
42
|
+
|
25
43
|
Time.at(at)
|
44
|
+
rescue ArgumentError
|
45
|
+
nil
|
26
46
|
end
|
27
47
|
|
28
48
|
def <=>(other)
|
@@ -38,10 +58,6 @@ module SimpleFeed
|
|
38
58
|
self.value == other.value
|
39
59
|
end
|
40
60
|
|
41
|
-
def to_h
|
42
|
-
{ value: value, at: at, time: time }
|
43
|
-
end
|
44
|
-
|
45
61
|
def hash
|
46
62
|
self.value.hash
|
47
63
|
end
|
@@ -54,16 +70,38 @@ module SimpleFeed
|
|
54
70
|
YAML.dump(to_h)
|
55
71
|
end
|
56
72
|
|
73
|
+
def to_h
|
74
|
+
return @to_h if @to_h
|
75
|
+
|
76
|
+
@to_h ||= { value: value, at: at }
|
77
|
+
@to_h.merge!(time: time) if time
|
78
|
+
@to_h
|
79
|
+
end
|
80
|
+
|
57
81
|
def to_s
|
58
|
-
|
82
|
+
return @to_s if @to_s
|
83
|
+
|
84
|
+
output = StringIO.new
|
85
|
+
output.print "<SimpleFeed::Event: "
|
86
|
+
output.print(time.nil? ? "[#{at}]" : "[#{time&.strftime(::SimpleFeed::TIME_FORMAT)}]")
|
87
|
+
output.print ", [\"#{value}\"]"
|
88
|
+
@to_s = output.string
|
59
89
|
end
|
60
90
|
|
91
|
+
COLOR_MAP = {
|
92
|
+
1 => ->(word) { word.green.bold },
|
93
|
+
3 => ->(word) { word.yellow.bold },
|
94
|
+
}.freeze
|
95
|
+
|
61
96
|
def to_color_s
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
97
|
+
return @to_color_s if @to_color_s
|
98
|
+
|
99
|
+
output = StringIO.new
|
100
|
+
to_s.split(/[\[\]]/).each_with_index do |word, index|
|
101
|
+
output.print(COLOR_MAP[index]&.call(word) || word.cyan)
|
102
|
+
end
|
103
|
+
output.print '>'
|
104
|
+
@to_color_s = output.string
|
67
105
|
end
|
68
106
|
|
69
107
|
def inspect
|
data/lib/simplefeed/feed.rb
CHANGED
@@ -2,11 +2,17 @@
|
|
2
2
|
|
3
3
|
require_relative 'providers'
|
4
4
|
require_relative 'activity/base'
|
5
|
-
|
5
|
+
require_relative 'providers/key'
|
6
6
|
|
7
7
|
module SimpleFeed
|
8
8
|
class Feed
|
9
|
-
attr_accessor :per_page,
|
9
|
+
attr_accessor :per_page,
|
10
|
+
:max_size,
|
11
|
+
:batch_size,
|
12
|
+
:namespace,
|
13
|
+
:data_key_transformer,
|
14
|
+
:meta_key_transformer
|
15
|
+
|
10
16
|
attr_reader :name
|
11
17
|
|
12
18
|
SimpleFeed::Providers.define_provider_methods(self) do |feed, method, opts, &block|
|
@@ -14,19 +20,21 @@ module SimpleFeed
|
|
14
20
|
end
|
15
21
|
|
16
22
|
def initialize(name)
|
17
|
-
@name
|
18
|
-
@name
|
23
|
+
@name = name
|
24
|
+
@name = name.underscore.to_sym unless name.is_a?(Symbol)
|
19
25
|
# set the defaults if not passed in
|
20
|
-
@meta
|
21
|
-
@namespace
|
26
|
+
@meta = {}
|
27
|
+
@namespace = nil
|
22
28
|
@per_page ||= 50
|
23
29
|
@max_size ||= 1000
|
24
30
|
@batch_size ||= 10
|
31
|
+
@meta_key_transformer = nil
|
32
|
+
@data_key_transformer = nil
|
25
33
|
@proxy = nil
|
26
34
|
end
|
27
35
|
|
28
36
|
def provider=(definition)
|
29
|
-
@proxy
|
37
|
+
@proxy = Providers::Proxy.from(definition)
|
30
38
|
@proxy.feed = self
|
31
39
|
@proxy
|
32
40
|
end
|
@@ -63,12 +71,15 @@ module SimpleFeed
|
|
63
71
|
end
|
64
72
|
|
65
73
|
def key(user_id)
|
66
|
-
SimpleFeed::Providers::Key.new(user_id,
|
74
|
+
SimpleFeed::Providers::Key.new(user_id,
|
75
|
+
namespace: namespace,
|
76
|
+
data_key_transformer: data_key_transformer,
|
77
|
+
meta_key_transformer: meta_key_transformer)
|
67
78
|
end
|
68
79
|
|
69
80
|
def eql?(other)
|
70
81
|
other.class == self.class &&
|
71
|
-
%i(per_page max_size name).all? { |m| send(m).equal?(other.send(m)) } &&
|
82
|
+
%i(per_page max_size name namespace data_key_transformer meta_key_transformer).all? { |m| send(m).equal?(other.send(m)) } &&
|
72
83
|
provider.provider.class == other.provider.provider.class
|
73
84
|
end
|
74
85
|
|
@@ -58,7 +58,7 @@ module SimpleFeed
|
|
58
58
|
def with_response_batched(user_ids, external_response = nil)
|
59
59
|
with_response(external_response) do |response|
|
60
60
|
batch(user_ids) do |key|
|
61
|
-
response.for(key.
|
61
|
+
response.for(key.consumer) { yield(key, response) }
|
62
62
|
end
|
63
63
|
end
|
64
64
|
end
|
@@ -2,10 +2,6 @@
|
|
2
2
|
|
3
3
|
require 'base62-rb'
|
4
4
|
require 'hashie/mash'
|
5
|
-
require 'simplefeed/key/template'
|
6
|
-
require 'simplefeed/key/type'
|
7
|
-
|
8
|
-
require 'forwardable'
|
9
5
|
|
10
6
|
module SimpleFeed
|
11
7
|
module Providers
|
@@ -15,66 +11,85 @@ module SimpleFeed
|
|
15
11
|
# ↓ ↓
|
16
12
|
# "ff|u.f23098.m"
|
17
13
|
# ↑ ↑
|
18
|
-
# namespace
|
14
|
+
# namespace consumer(base62)
|
19
15
|
#
|
20
16
|
class Key
|
21
|
-
|
17
|
+
class << self
|
18
|
+
def rot13(value)
|
19
|
+
value.tr('abcdefghijklmnopqrstuvwxyz',
|
20
|
+
'nopqrstuvwxyzabcdefghijklm')
|
21
|
+
end
|
22
|
+
end
|
22
23
|
|
23
|
-
|
24
|
-
|
24
|
+
SERIALIZED_DATA_TEMPLATE = '{{namespace}}u.{{data_id}}.d'
|
25
|
+
SERIALIZED_META_TEMPLATE = '{{namespace}}u.{{meta_id}}.m'
|
25
26
|
|
26
|
-
|
27
|
-
self.user_id = user_id
|
28
|
-
self.key_template = key_template
|
27
|
+
attr_reader :consumer, :namespace, :data_key_transformer, :meta_key_transformer
|
29
28
|
|
30
|
-
|
29
|
+
def initialize(consumer,
|
30
|
+
namespace: nil,
|
31
|
+
data_key_transformer: nil,
|
32
|
+
meta_key_transformer: nil)
|
33
|
+
@consumer = consumer
|
34
|
+
@namespace = namespace
|
35
|
+
@data_key_transformer = data_key_transformer
|
36
|
+
@meta_key_transformer = meta_key_transformer
|
31
37
|
end
|
32
38
|
|
33
|
-
|
34
|
-
|
35
|
-
key_template.key_types.each do |type|
|
36
|
-
key_name = type.name
|
37
|
-
next if respond_to?(key_name)
|
38
|
-
|
39
|
-
self.class.send(:define_method, key_name) do
|
40
|
-
instance_variable_get("@#{key_name}") ||
|
41
|
-
instance_variable_set("@#{key_name}", type.render(render_options))
|
42
|
-
end
|
43
|
-
end
|
39
|
+
def data
|
40
|
+
@data ||= render(SERIALIZED_DATA_TEMPLATE)
|
44
41
|
end
|
45
42
|
|
46
|
-
def
|
47
|
-
@
|
48
|
-
::Base62.encode(user_id)
|
49
|
-
else
|
50
|
-
rot13(user_id.to_s)
|
51
|
-
end
|
43
|
+
def meta
|
44
|
+
@meta ||= render(SERIALIZED_META_TEMPLATE)
|
52
45
|
end
|
53
46
|
|
54
47
|
def keys
|
55
|
-
|
56
|
-
end
|
57
|
-
|
58
|
-
def render_options
|
59
|
-
key_template.render_options.merge!({
|
60
|
-
'user_id' => user_id,
|
61
|
-
'base62_user_id' => base62_user_id
|
62
|
-
})
|
48
|
+
[data, meta]
|
63
49
|
end
|
64
50
|
|
65
51
|
def to_s
|
66
|
-
super +
|
52
|
+
super + key_params.to_s
|
67
53
|
end
|
68
54
|
|
69
55
|
def inspect
|
70
|
-
|
56
|
+
super + key_params.inspect
|
71
57
|
end
|
72
58
|
|
73
59
|
private
|
74
60
|
|
75
|
-
def
|
76
|
-
|
77
|
-
|
61
|
+
def render(template)
|
62
|
+
template.dup.tap do |output|
|
63
|
+
key_params.each_pair do |key, value|
|
64
|
+
output.gsub!(/{{#{key}}}/, value.to_s)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def obscure_value(id)
|
70
|
+
id = id.to_i if id.is_a?(String) && id =~ /^\d+$/
|
71
|
+
|
72
|
+
if id.is_a?(Numeric)
|
73
|
+
::Base62.encode(id)
|
74
|
+
else
|
75
|
+
self.class.rot13(id.to_s)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def key_params
|
80
|
+
@key_params ||= Hashie::Mash.new(
|
81
|
+
namespace: namespace ? "#{namespace}|" : '',
|
82
|
+
data_id: obscure_value(data_id),
|
83
|
+
meta_id: obscure_value(meta_id)
|
84
|
+
)
|
85
|
+
end
|
86
|
+
|
87
|
+
def meta_id
|
88
|
+
meta_key_transformer&.call(consumer) || consumer
|
89
|
+
end
|
90
|
+
|
91
|
+
def data_id
|
92
|
+
data_key_transformer&.call(consumer) || consumer
|
78
93
|
end
|
79
94
|
end
|
80
95
|
end
|
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
module SimpleFeed
|
4
4
|
module Providers
|
5
|
+
RUBY_MAJOR_VERSION = RUBY_VERSION.split('.')[0..1].join.to_i
|
6
|
+
|
5
7
|
class Proxy
|
6
8
|
attr_accessor :provider
|
7
9
|
|
@@ -15,7 +17,7 @@ module SimpleFeed
|
|
15
17
|
end
|
16
18
|
|
17
19
|
def initialize(provider_or_klass, *args, **options)
|
18
|
-
self.provider = if provider_or_klass.is_a?(::String)
|
20
|
+
self.provider = if provider_or_klass.is_a?(::String) || provider_or_klass.is_a?(::Symbol)
|
19
21
|
::Object.const_get(provider_or_klass).new(*args, **options)
|
20
22
|
else
|
21
23
|
provider_or_klass
|
@@ -26,12 +28,23 @@ module SimpleFeed
|
|
26
28
|
end
|
27
29
|
end
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
provider
|
33
|
-
|
34
|
-
|
31
|
+
if RUBY_MAJOR_VERSION >= 27
|
32
|
+
# Forward all other method calls to Provider
|
33
|
+
def method_missing(name, *args, **opts, &block)
|
34
|
+
if provider&.respond_to?(name)
|
35
|
+
provider.send(name, *args, **opts, &block)
|
36
|
+
else
|
37
|
+
super(name, *args, **opts, &block)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
else
|
41
|
+
# Forward all other method calls to Provider
|
42
|
+
def method_missing(name, *args, &block)
|
43
|
+
if provider&.respond_to?(name)
|
44
|
+
provider.send(name, *args, &block)
|
45
|
+
else
|
46
|
+
super(name, *args, &block)
|
47
|
+
end
|
35
48
|
end
|
36
49
|
end
|
37
50
|
end
|
@@ -139,12 +139,10 @@ module SimpleFeed
|
|
139
139
|
end
|
140
140
|
end
|
141
141
|
|
142
|
-
def with_pipelined
|
142
|
+
def with_pipelined(&block)
|
143
143
|
with_retries do
|
144
144
|
with_redis do |redis|
|
145
|
-
redis.pipelined
|
146
|
-
yield(redis)
|
147
|
-
end
|
145
|
+
redis.pipelined(&block)
|
148
146
|
end
|
149
147
|
end
|
150
148
|
end
|
@@ -51,9 +51,9 @@ module SimpleFeed
|
|
51
51
|
raise ArgumentError, '#delete_if must be called with a block that receives (user_id, event) as arguments.' unless block_given?
|
52
52
|
|
53
53
|
with_response_batched(user_ids) do |key|
|
54
|
-
fetch(user_ids: [key.
|
54
|
+
fetch(user_ids: [key.consumer])[key.consumer].map do |event|
|
55
55
|
with_redis do |redis|
|
56
|
-
if yield(event, key.
|
56
|
+
if yield(event, key.consumer)
|
57
57
|
redis.zrem(key.data, event.value) ? event : nil
|
58
58
|
end
|
59
59
|
end
|
@@ -90,7 +90,7 @@ module SimpleFeed
|
|
90
90
|
|
91
91
|
response = with_response_pipelined(user_ids) do |redis, key|
|
92
92
|
if since == :unread
|
93
|
-
redis.zrevrangebyscore(key.data, '+inf', (last_read_response.delete(key.
|
93
|
+
redis.zrevrangebyscore(key.data, '+inf', (last_read_response.delete(key.consumer) || 0).to_f, withscores: true)
|
94
94
|
elsif since
|
95
95
|
redis.zrevrangebyscore(key.data, '+inf', since.to_f, withscores: true)
|
96
96
|
else
|
@@ -120,7 +120,7 @@ module SimpleFeed
|
|
120
120
|
get_users_last_read(redis, key)
|
121
121
|
end
|
122
122
|
with_response_pipelined(response.user_ids, response) do |redis, key, _response|
|
123
|
-
last_read = _response.delete(key.
|
123
|
+
last_read = _response.delete(key.consumer).to_f
|
124
124
|
redis.zcount(key.data, last_read, '+inf')
|
125
125
|
end
|
126
126
|
end
|
@@ -223,7 +223,7 @@ module SimpleFeed
|
|
223
223
|
def with_response_pipelined(user_ids, response = nil)
|
224
224
|
with_response(response) do |response|
|
225
225
|
batch_pipelined(user_ids) do |redis, key|
|
226
|
-
response.for(key.
|
226
|
+
response.for(key.consumer) { yield(redis, key, response) }
|
227
227
|
end
|
228
228
|
end
|
229
229
|
end
|
@@ -231,7 +231,7 @@ module SimpleFeed
|
|
231
231
|
def with_response_multi(user_ids, response = nil)
|
232
232
|
with_response(response) do |response|
|
233
233
|
batch_multi(user_ids) do |redis, key|
|
234
|
-
response.for(key.
|
234
|
+
response.for(key.consumer) { yield(redis, key, response) }
|
235
235
|
end
|
236
236
|
end
|
237
237
|
end
|
data/lib/simplefeed/providers.rb
CHANGED
data/lib/simplefeed/response.rb
CHANGED
@@ -12,11 +12,9 @@ module SimpleFeed
|
|
12
12
|
|
13
13
|
include Enumerable
|
14
14
|
|
15
|
-
def each
|
15
|
+
def each(&block)
|
16
16
|
if block_given?
|
17
|
-
@result.each_pair
|
18
|
-
yield(user_id, result)
|
19
|
-
end
|
17
|
+
@result.each_pair(&block)
|
20
18
|
else
|
21
19
|
@result.keys.to_enum
|
22
20
|
end
|
@@ -28,7 +26,7 @@ module SimpleFeed
|
|
28
26
|
|
29
27
|
def for(key_or_user_id, result = nil)
|
30
28
|
user_id = key_or_user_id.is_a?(SimpleFeed::Providers::Key) ?
|
31
|
-
key_or_user_id.
|
29
|
+
key_or_user_id.consumer :
|
32
30
|
key_or_user_id
|
33
31
|
|
34
32
|
@result[user_id] = result || yield(@result[user_id])
|
data/lib/simplefeed/version.rb
CHANGED