weeter 0.13.0 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -11,6 +11,7 @@ module Weeter
11
11
  autoload 'Twitter', 'weeter/twitter'
12
12
  autoload 'Limitator', 'weeter/limitator'
13
13
  autoload 'Configuration', 'weeter/configuration'
14
+ autoload 'TweetItem', 'weeter/tweet_item'
14
15
 
15
16
  def configure
16
17
  yield Configuration.instance
@@ -4,7 +4,7 @@ module Weeter
4
4
 
5
5
  class Configuration
6
6
  include Singleton
7
- attr_accessor :log_path, :subscriptions_limit
7
+ attr_accessor :log_path
8
8
 
9
9
  autoload :ClientAppConfig, 'weeter/configuration/client_app_config'
10
10
  autoload :TwitterConfig, 'weeter/configuration/twitter_config'
@@ -45,7 +45,7 @@ module Weeter
45
45
  end
46
46
 
47
47
  def tweet_consumer
48
- @tweet_consumer ||= Weeter::Twitter::TweetConsumer.new(@config.twitter, notification_plugin, limiter, @config.subscriptions_limit)
48
+ @tweet_consumer ||= Weeter::Twitter::TweetConsumer.new(@config.twitter, notification_plugin, limiter)
49
49
  end
50
50
  end
51
51
  end
@@ -1,2 +1 @@
1
1
  require 'weeter/twitter/tweet_consumer'
2
- require 'weeter/twitter/tweet_item'
@@ -5,6 +5,8 @@ module Weeter
5
5
  module Twitter
6
6
  class TweetConsumer
7
7
  extend ::Forwardable
8
+ TRACK_LIMIT = 400
9
+ FOLLOW_LIMIT = 5000
8
10
 
9
11
  attr_reader :limiter, :notifier
10
12
  def_delegators :@notifier, :notify_missed_tweets,
@@ -12,15 +14,14 @@ module Weeter
12
14
  :delete_tweet,
13
15
  :publish_tweet
14
16
 
15
- def initialize(twitter_config, notifier, limiter, subscriptions_limit = nil)
17
+ def initialize(twitter_config, notifier, limiter)
16
18
  @config = twitter_config
17
19
  @notifier = notifier
18
20
  @limiter = limiter
19
- @subscriptions_limit = subscriptions_limit
20
21
  end
21
22
 
22
23
  def connect(filter_params)
23
- filter_params = limit_filter_params(filter_params) if @subscriptions_limit
24
+ filter_params = limit_filter_params(filter_params)
24
25
  filter_params = clean_filter_params(filter_params)
25
26
 
26
27
 
@@ -75,27 +76,16 @@ module Weeter
75
76
  follow_count = result['follow'].length
76
77
  track_count = result['track'].length
77
78
 
78
- total = follow_count + track_count
79
-
80
- if total > @subscriptions_limit
81
- Weeter.logger.error("Twitter Subscriptions are #{total}, but limited to #{@subscriptions_limit} subscriptions")
79
+ if follow_count > FOLLOW_LIMIT
80
+ Weeter.logger.error("Twitter Subscriptions include #{follow_count} follows, but are limited to #{FOLLOW_LIMIT}")
81
+ result['follow'] = result['follow'][0...FOLLOW_LIMIT]
82
82
  end
83
83
 
84
- while total > 1000
85
- if follow_count > track_count
86
- follow_count -= 1
87
- elsif track_count > follow_count
88
- track_count -= 1
89
- else
90
- track_count -= 1
91
- end
92
-
93
- total = follow_count + track_count
84
+ if track_count > TRACK_LIMIT
85
+ Weeter.logger.error("Twitter Subscriptions include #{track_count} tracks, but are limited to #{TRACK_LIMIT}")
86
+ result['track'] = result['track'][0...TRACK_LIMIT]
94
87
  end
95
88
 
96
- result['track'] = result['track'][0...track_count]
97
- result['follow'] = result['follow'][0...follow_count]
98
-
99
89
  result
100
90
  end
101
91
 
@@ -1,3 +1,3 @@
1
1
  module Weeter
2
- VERSION = "0.13.0"
2
+ VERSION = "0.14.0"
3
3
  end
@@ -24,7 +24,7 @@ describe Weeter::Twitter::TweetConsumer do
24
24
 
25
25
  let(:client_proxy) { mock('NotificationPlugin', :publish_tweet => nil) }
26
26
  let(:consumer) do
27
- Weeter::Twitter::TweetConsumer.new(Weeter::Configuration::TwitterConfig.instance, client_proxy, limiter, 1000)
27
+ Weeter::Twitter::TweetConsumer.new(Weeter::Configuration::TwitterConfig.instance, client_proxy, limiter)
28
28
  end
29
29
 
30
30
  let(:track) {[]}
@@ -46,45 +46,34 @@ describe Weeter::Twitter::TweetConsumer do
46
46
  end
47
47
 
48
48
  context 'follow above' do
49
- let(:follow) { (1..1001).to_a }
49
+ let(:follow) { (1..5001).to_a }
50
50
 
51
51
  it 'it limits follows, but not tracks' do
52
52
  result = consumer.send(:limit_filter_params, params)
53
- result.fetch('follow').length.should == 1000
53
+ result.fetch('follow').length.should == 5000
54
54
  result.fetch('track').length.should == 0
55
55
  end
56
56
  end
57
57
 
58
58
  context 'track above' do
59
- let(:track) { (1..1001).to_a }
59
+ let(:track) { (1..401).to_a }
60
60
 
61
61
  it 'limits tracks, but not follows' do
62
62
  result = consumer.send(:limit_filter_params, params)
63
- result.fetch('track').length.should == 1000
63
+ result.fetch('track').length.should == 400
64
64
  result.fetch('follow').length.should == 0
65
65
  end
66
66
  end
67
67
 
68
- context 'they are equally over' do
69
- let(:track) { (1..600).to_a }
70
- let(:follow) { (1..600).to_a }
68
+ context 'they are both over' do
69
+ let(:track) { (1..401).to_a }
70
+ let(:follow) { (1..5001).to_a }
71
71
 
72
- it 'limits tracks, but not follows' do
72
+ it 'limits both' do
73
73
 
74
74
  result = consumer.send(:limit_filter_params, params)
75
- result.fetch('track').length.should == 500
76
- result.fetch('follow').length.should == 500
77
- end
78
- end
79
-
80
- context 'track is more over' do
81
- let(:track) { (1..800).to_a }
82
- let(:follow) { (1..300).to_a }
83
-
84
- it 'limits tracks, but not follows' do
85
- result = consumer.send(:limit_filter_params, params)
86
- result.fetch('track').length.should == 700
87
- result.fetch('follow').length.should == 300
75
+ result.fetch('track').length.should == 400
76
+ result.fetch('follow').length.should == 5000
88
77
  end
89
78
  end
90
79
  end
@@ -132,7 +121,7 @@ describe Weeter::Twitter::TweetConsumer do
132
121
  end
133
122
 
134
123
  it "should not publish unpublishable tweets" do
135
- mock_tweet = mock('tweet', :deletion? => false, :publishable? => false, :limit_notice? => false, :[] => '', :limiting_facets => [])
124
+ mock_tweet = mock('tweet', :deletion? => false, :publishable? => false, :limit_notice? => false, :[] => '', :limiting_facets => [], :disconnect_notice? => false)
136
125
  Weeter::TweetItem.stub!(:new).and_return mock_tweet
137
126
  @client_proxy.should_not_receive(:publish_tweet).with(mock_tweet)
138
127
  end
@@ -9,18 +9,6 @@ Weeter.configure do |conf|
9
9
  # To disable logging:
10
10
  # conf.log_path = false
11
11
 
12
- # To hard limits number of subscriptions.
13
- # If the limit has been reached it will log and error, and fairly truncate
14
- # subscriptions.
15
- #
16
- # default: nolimit = nil
17
- #
18
- # ** Please Note **
19
- # - by default, twitter will reject connection attempts
20
- # with greater then 1000 subscriptions
21
- #
22
- # conf.subscriptions_limit = 1000
23
-
24
12
  conf.twitter do |twitter|
25
13
  # For basic auth
26
14
  # twitter.basic_auth = {:username => 'johnny', :password => 'secret'}
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: weeter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.0
4
+ version: 0.14.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,140 +11,200 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2012-12-04 00:00:00.000000000Z
14
+ date: 2012-12-31 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: eventmachine
18
- requirement: &2161838440 !ruby/object:Gem::Requirement
19
- none: false
18
+ prerelease: false
19
+ requirement: !ruby/object:Gem::Requirement
20
20
  requirements:
21
21
  - - ! '>='
22
22
  - !ruby/object:Gem::Version
23
23
  version: '0'
24
+ none: false
24
25
  type: :runtime
25
- prerelease: false
26
- version_requirements: *2161838440
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
31
+ none: false
27
32
  - !ruby/object:Gem::Dependency
28
33
  name: eventmachine_httpserver
29
- requirement: &2161836940 !ruby/object:Gem::Requirement
30
- none: false
34
+ prerelease: false
35
+ requirement: !ruby/object:Gem::Requirement
31
36
  requirements:
32
37
  - - ! '>='
33
38
  - !ruby/object:Gem::Version
34
39
  version: 0.2.1
40
+ none: false
35
41
  type: :runtime
36
- prerelease: false
37
- version_requirements: *2161836940
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: 0.2.1
47
+ none: false
38
48
  - !ruby/object:Gem::Dependency
39
49
  name: em-hiredis
40
- requirement: &2161835100 !ruby/object:Gem::Requirement
41
- none: false
50
+ prerelease: false
51
+ requirement: !ruby/object:Gem::Requirement
42
52
  requirements:
43
53
  - - ! '>='
44
54
  - !ruby/object:Gem::Version
45
55
  version: 0.1.0
56
+ none: false
46
57
  type: :runtime
47
- prerelease: false
48
- version_requirements: *2161835100
58
+ version_requirements: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: 0.1.0
63
+ none: false
49
64
  - !ruby/object:Gem::Dependency
50
65
  name: multi_json
51
- requirement: &2161833640 !ruby/object:Gem::Requirement
52
- none: false
66
+ prerelease: false
67
+ requirement: !ruby/object:Gem::Requirement
53
68
  requirements:
54
69
  - - ! '>='
55
70
  - !ruby/object:Gem::Version
56
71
  version: 1.0.2
72
+ none: false
57
73
  type: :runtime
58
- prerelease: false
59
- version_requirements: *2161833640
74
+ version_requirements: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: 1.0.2
79
+ none: false
60
80
  - !ruby/object:Gem::Dependency
61
81
  name: hashie
62
- requirement: &2161832500 !ruby/object:Gem::Requirement
63
- none: false
82
+ prerelease: false
83
+ requirement: !ruby/object:Gem::Requirement
64
84
  requirements:
65
85
  - - ! '>='
66
86
  - !ruby/object:Gem::Version
67
87
  version: 1.1.0
88
+ none: false
68
89
  type: :runtime
69
- prerelease: false
70
- version_requirements: *2161832500
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: 1.1.0
95
+ none: false
71
96
  - !ruby/object:Gem::Dependency
72
97
  name: em-http-request
73
- requirement: &2161832040 !ruby/object:Gem::Requirement
74
- none: false
98
+ prerelease: false
99
+ requirement: !ruby/object:Gem::Requirement
75
100
  requirements:
76
101
  - - ! '>='
77
102
  - !ruby/object:Gem::Version
78
103
  version: 1.0.0
104
+ none: false
79
105
  type: :runtime
80
- prerelease: false
81
- version_requirements: *2161832040
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: 1.0.0
111
+ none: false
82
112
  - !ruby/object:Gem::Dependency
83
113
  name: i18n
84
- requirement: &2161831220 !ruby/object:Gem::Requirement
85
- none: false
114
+ prerelease: false
115
+ requirement: !ruby/object:Gem::Requirement
86
116
  requirements:
87
117
  - - ~>
88
118
  - !ruby/object:Gem::Version
89
119
  version: 0.6.0
120
+ none: false
90
121
  type: :runtime
91
- prerelease: false
92
- version_requirements: *2161831220
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ~>
125
+ - !ruby/object:Gem::Version
126
+ version: 0.6.0
127
+ none: false
93
128
  - !ruby/object:Gem::Dependency
94
129
  name: activesupport
95
- requirement: &2161830060 !ruby/object:Gem::Requirement
96
- none: false
130
+ prerelease: false
131
+ requirement: !ruby/object:Gem::Requirement
97
132
  requirements:
98
133
  - - ! '>='
99
134
  - !ruby/object:Gem::Version
100
135
  version: 3.1.1
136
+ none: false
101
137
  type: :runtime
102
- prerelease: false
103
- version_requirements: *2161830060
138
+ version_requirements: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: 3.1.1
143
+ none: false
104
144
  - !ruby/object:Gem::Dependency
105
145
  name: simple_oauth
106
- requirement: &2161829240 !ruby/object:Gem::Requirement
107
- none: false
146
+ prerelease: false
147
+ requirement: !ruby/object:Gem::Requirement
108
148
  requirements:
109
149
  - - ~>
110
150
  - !ruby/object:Gem::Version
111
151
  version: 0.1.5
152
+ none: false
112
153
  type: :runtime
113
- prerelease: false
114
- version_requirements: *2161829240
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ~>
157
+ - !ruby/object:Gem::Version
158
+ version: 0.1.5
159
+ none: false
115
160
  - !ruby/object:Gem::Dependency
116
161
  name: lukemelia-twitter-stream
117
- requirement: &2161828460 !ruby/object:Gem::Requirement
118
- none: false
162
+ prerelease: false
163
+ requirement: !ruby/object:Gem::Requirement
119
164
  requirements:
120
165
  - - ~>
121
166
  - !ruby/object:Gem::Version
122
167
  version: 0.1.15
168
+ none: false
123
169
  type: :runtime
124
- prerelease: false
125
- version_requirements: *2161828460
170
+ version_requirements: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ~>
173
+ - !ruby/object:Gem::Version
174
+ version: 0.1.15
175
+ none: false
126
176
  - !ruby/object:Gem::Dependency
127
177
  name: rspec
128
- requirement: &2161827700 !ruby/object:Gem::Requirement
129
- none: false
178
+ prerelease: false
179
+ requirement: !ruby/object:Gem::Requirement
130
180
  requirements:
131
181
  - - ~>
132
182
  - !ruby/object:Gem::Version
133
183
  version: 2.6.0
184
+ none: false
134
185
  type: :development
135
- prerelease: false
136
- version_requirements: *2161827700
186
+ version_requirements: !ruby/object:Gem::Requirement
187
+ requirements:
188
+ - - ~>
189
+ - !ruby/object:Gem::Version
190
+ version: 2.6.0
191
+ none: false
137
192
  - !ruby/object:Gem::Dependency
138
193
  name: ZenTest
139
- requirement: &2161826960 !ruby/object:Gem::Requirement
140
- none: false
194
+ prerelease: false
195
+ requirement: !ruby/object:Gem::Requirement
141
196
  requirements:
142
197
  - - ! '>='
143
198
  - !ruby/object:Gem::Version
144
199
  version: '0'
200
+ none: false
145
201
  type: :development
146
- prerelease: false
147
- version_requirements: *2161826960
202
+ version_requirements: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - ! '>='
205
+ - !ruby/object:Gem::Version
206
+ version: '0'
207
+ none: false
148
208
  description: Weeter subscribes to a set of twitter users or search terms using Twitter's
149
209
  streaming API, and notifies your app with each new tweet.
150
210
  email:
@@ -182,9 +242,9 @@ files:
182
242
  - lib/weeter/plugins/subscription_plugin.rb
183
243
  - lib/weeter/runner.rb
184
244
  - lib/weeter/tasks.rb
245
+ - lib/weeter/tweet_item.rb
185
246
  - lib/weeter/twitter.rb
186
247
  - lib/weeter/twitter/tweet_consumer.rb
187
- - lib/weeter/twitter/tweet_item.rb
188
248
  - lib/weeter/version.rb
189
249
  - log/.gitignore
190
250
  - spec/.DS_Store
@@ -208,20 +268,20 @@ rdoc_options: []
208
268
  require_paths:
209
269
  - lib
210
270
  required_ruby_version: !ruby/object:Gem::Requirement
211
- none: false
212
271
  requirements:
213
272
  - - ! '>='
214
273
  - !ruby/object:Gem::Version
215
274
  version: '0'
216
- required_rubygems_version: !ruby/object:Gem::Requirement
217
275
  none: false
276
+ required_rubygems_version: !ruby/object:Gem::Requirement
218
277
  requirements:
219
278
  - - ! '>='
220
279
  - !ruby/object:Gem::Version
221
280
  version: '0'
281
+ none: false
222
282
  requirements: []
223
283
  rubyforge_project: weeter
224
- rubygems_version: 1.8.10
284
+ rubygems_version: 1.8.24
225
285
  signing_key:
226
286
  specification_version: 3
227
287
  summary: Consume the Twitter stream and notify your app