powertrack 1.3.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/Gemfile +1 -1
- data/Gemfile.lock +6 -3
- data/History.txt +7 -1
- data/README.md +8 -4
- data/lib/powertrack/rules/rule.rb +14 -73
- data/lib/powertrack/streaming/stream.rb +22 -55
- data/lib/powertrack/version.rb +1 -1
- data/test/minitest_helper.rb +2 -3
- data/test/test_manage_rules.rb +21 -37
- data/test/test_rule.rb +20 -179
- data/test/test_track_stream.rb +19 -32
- metadata +27 -29
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
ODZiMjAzMjJhNmI0ZTg1ZGI4MmI4YjgwNjhiMWM0NGY2Mjg3Y2U4Zg==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b66eefaa2405a5c5087fc1736170bc562efa4322
|
4
|
+
data.tar.gz: aedb846d2550c44716a803793812a3d22d7397e0
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
NjU2ODNkODllMGI1MjI1NmQyZGRjODc1N2Q5MGQzMWNmY2FjYmRmMzgwYWJl
|
11
|
-
MzI0MjQzYjBmMTI5YTdmZjc4NzhkNTg5YjU3YzgxMzgwMWQ2NTM=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
ODY0NGIyODVlYmQzMWIwNzBlN2NhYzBjNWM0MzU3YjNkY2I4MGEzMzgxY2Qy
|
14
|
-
YWRkMzJiZTRlYmFhMGYyNzNlZTQzZTNkYzVjMGE3MGRkNGRkNWM5MGYyODQ4
|
15
|
-
NzE1YjY1NDRmY2MyMDE2NDFlZmYxZDcyYmVlODk5ZjA2YTRkODM=
|
6
|
+
metadata.gz: 42f74190100119a58477e7123a52e179800202b713342aaa005b390b34980a9492bd328a1f8a598b4c09715a5eb60679ef0931a703c21d5f7d19428822232414
|
7
|
+
data.tar.gz: b200cd8cd5536b468fab9ea9db5f068876a3b61765fe567f0bf6d5ea1f213515054e98bbc31aebbdc8cea0a5d64ce98f7961fa3f14082d2246a097ef51d33a97
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
powertrack (
|
4
|
+
powertrack (2.0.0)
|
5
5
|
em-http-request (~> 1.1)
|
6
6
|
eventmachine (~> 1.0)
|
7
7
|
exponential-backoff (~> 0.0.2)
|
@@ -29,7 +29,7 @@ GEM
|
|
29
29
|
rake (10.4.2)
|
30
30
|
ruby-prof (0.15.8)
|
31
31
|
void_logger (0.1)
|
32
|
-
yajl-ruby (1.
|
32
|
+
yajl-ruby (1.3.1)
|
33
33
|
|
34
34
|
PLATFORMS
|
35
35
|
ruby
|
@@ -40,4 +40,7 @@ DEPENDENCIES
|
|
40
40
|
powertrack!
|
41
41
|
rake (~> 10.3)
|
42
42
|
ruby-prof (~> 0.15)
|
43
|
-
yajl-ruby (~> 1.
|
43
|
+
yajl-ruby (~> 1.3.1)
|
44
|
+
|
45
|
+
BUNDLED WITH
|
46
|
+
1.10.6
|
data/History.txt
CHANGED
data/README.md
CHANGED
@@ -128,16 +128,20 @@ replaying the same timeframe again and again when GNIP is unstable.
|
|
128
128
|
All the errors that come from PowerTrack are defined through an ad-hoc exception
|
129
129
|
class hierarchy. See ```lib/powertrack/errors.rb```.
|
130
130
|
|
131
|
+
## PowerTrack v1
|
132
|
+
|
133
|
+
The library was originally designed for PowerTrack v1. But this version of the
|
134
|
+
PowerTrack API was sunset in early January 2017.
|
135
|
+
|
136
|
+
Consequently, since v2.0, the library does not support v1 anymore.
|
137
|
+
|
131
138
|
## PowerTrack v2
|
132
139
|
|
133
|
-
The library provides
|
140
|
+
The library provides support for PowerTrack API version 2. Please read
|
134
141
|
[PowerTrack API v2](http://support.gnip.com/apis/powertrack2.0/index.html) and
|
135
142
|
the [Migration Guide](http://support.gnip.com/apis/powertrack2.0/transition.html)
|
136
143
|
for details about this new major release.
|
137
144
|
|
138
|
-
Set the ```:v2```option to ```true``` when building a ```PowerTrack::Stream```
|
139
|
-
object to enable this feature. The library uses v1 by default.
|
140
|
-
|
141
145
|
Everything should work the same for v2 as for v1 except
|
142
146
|
|
143
147
|
o ```PowerTrack::Stream.add_rule``` and ```PowerTrack::Stream.delete_rule```
|
@@ -7,11 +7,8 @@ module PowerTrack
|
|
7
7
|
# The maximum length of a rule tag.
|
8
8
|
MAX_TAG_LENGTH = 255
|
9
9
|
|
10
|
-
# The maximum lengh of the value of a
|
11
|
-
|
12
|
-
|
13
|
-
# The maximum lengh of the value of a long rule
|
14
|
-
MAX_LONG_RULE_VALUE_LENGTH = 2048
|
10
|
+
# The maximum lengh of the value of a rule
|
11
|
+
MAX_RULE_VALUE_LENGTH = 2048
|
15
12
|
|
16
13
|
# The maximum number of positive terms in a single rule value
|
17
14
|
MAX_POSITIVE_TERMS = 30
|
@@ -20,58 +17,29 @@ module PowerTrack
|
|
20
17
|
MAX_NEGATIVE_TERMS = 50
|
21
18
|
|
22
19
|
# The maximum size of the HTTP body accepted by PowerTrack /rules calls (in bytes)
|
23
|
-
#
|
24
|
-
MAX_RULES_BODY_SIZE =
|
25
|
-
v1: 1024**2,
|
26
|
-
v2: 5*1024**2
|
27
|
-
}
|
20
|
+
# 5MB since v2
|
21
|
+
MAX_RULES_BODY_SIZE = 5*1024**2
|
28
22
|
|
29
23
|
# The default rule features
|
30
24
|
DEFAULT_RULE_FEATURES = {
|
31
25
|
# no id by default
|
32
26
|
id: nil,
|
33
27
|
# no tag by default
|
34
|
-
tag: nil
|
35
|
-
# long determined by value length
|
36
|
-
long: nil,
|
37
|
-
# v1 by default
|
38
|
-
v2: false
|
28
|
+
tag: nil
|
39
29
|
}.freeze
|
40
30
|
|
41
31
|
attr_reader :value, :id, :tag, :error
|
42
32
|
|
43
33
|
# Builds a new rule based on a value and some optional features
|
44
|
-
# (:id, :tag
|
45
|
-
#
|
46
|
-
# By default, the constructor assesses if it's a long rule or not
|
47
|
-
# based on the length of the value. But the 'long' feature can be
|
48
|
-
# explicitly specified with the :long feature. Finally, if :v2 is
|
49
|
-
# true the rule is always considered long.
|
34
|
+
# (:id, :tag).
|
50
35
|
def initialize(value, features=nil)
|
51
36
|
@value = value || ''
|
52
37
|
features = DEFAULT_RULE_FEATURES.merge(features || {})
|
53
38
|
@tag = features[:tag]
|
54
39
|
@id = features[:id]
|
55
|
-
# only accept boolean values
|
56
|
-
_v2 = features[:v2]
|
57
|
-
@v2 = (_v2 == !!_v2) ? _v2 : false
|
58
|
-
# check if long is a boolean
|
59
|
-
_long = features[:long]
|
60
|
-
# v2 rules are always long
|
61
|
-
@long = (@v2 ? true : (_long == !!_long ? _long : @value.size > MAX_STD_RULE_VALUE_LENGTH))
|
62
40
|
@error = nil
|
63
41
|
end
|
64
42
|
|
65
|
-
# Returns true if the rule is long.
|
66
|
-
def long?
|
67
|
-
@long
|
68
|
-
end
|
69
|
-
|
70
|
-
# Returns true if the rule is v2.
|
71
|
-
def v2?
|
72
|
-
@v2
|
73
|
-
end
|
74
|
-
|
75
43
|
# Returns true if the rule is valid, false otherwise. The validation error
|
76
44
|
# can be through the error method.
|
77
45
|
def valid?
|
@@ -82,23 +50,12 @@ module PowerTrack
|
|
82
50
|
:too_long_value?,
|
83
51
|
:contains_empty_source?,
|
84
52
|
:contains_negated_or?,
|
85
|
-
:too_long_tag
|
53
|
+
:too_long_tag?,
|
54
|
+
:contains_explicit_and?,
|
55
|
+
:contains_lowercase_or?,
|
56
|
+
:contains_explicit_not?
|
86
57
|
]
|
87
58
|
|
88
|
-
if @v2
|
89
|
-
validation_rules += [
|
90
|
-
:contains_explicit_and?,
|
91
|
-
:contains_lowercase_or?,
|
92
|
-
:contains_explicit_not?
|
93
|
-
]
|
94
|
-
else
|
95
|
-
# no more restriction on the number of positive and negative terms in v2
|
96
|
-
validation_rules += [
|
97
|
-
:too_many_positive_terms?,
|
98
|
-
:too_many_negative_terms?
|
99
|
-
]
|
100
|
-
end
|
101
|
-
|
102
59
|
validation_rules.each do |validator|
|
103
60
|
# stop when 1 validator fails
|
104
61
|
if self.send(validator)
|
@@ -132,8 +89,7 @@ module PowerTrack
|
|
132
89
|
def ==(other)
|
133
90
|
other.class == self.class &&
|
134
91
|
other.value == @value &&
|
135
|
-
other.tag == @tag
|
136
|
-
other.long? == self.long?
|
92
|
+
other.tag == @tag
|
137
93
|
end
|
138
94
|
|
139
95
|
alias eql? ==
|
@@ -142,13 +98,12 @@ module PowerTrack
|
|
142
98
|
# rules as Hash keys.
|
143
99
|
def hash
|
144
100
|
# let's assume a nil value for @value or @tag is not different from the empty value
|
145
|
-
"v:#{@value},t:#{@tag}
|
101
|
+
"v:#{@value},t:#{@tag}".hash
|
146
102
|
end
|
147
103
|
|
148
|
-
# Returns the maximum length of the rule value
|
149
|
-
# rule (long or standard).
|
104
|
+
# Returns the maximum length of the rule value.
|
150
105
|
def max_value_length
|
151
|
-
|
106
|
+
MAX_RULE_VALUE_LENGTH
|
152
107
|
end
|
153
108
|
|
154
109
|
protected
|
@@ -178,20 +133,6 @@ module PowerTrack
|
|
178
133
|
!@value[/(^| )NOT /].nil?
|
179
134
|
end
|
180
135
|
|
181
|
-
# Does the rule value contain too many positive terms ?
|
182
|
-
def too_many_positive_terms?
|
183
|
-
return false if long?
|
184
|
-
# negative look-behind; see http://www.rexegg.com/regex-disambiguation.html
|
185
|
-
# exclude the OR operator from the terms being counted
|
186
|
-
@value.scan(/(?<!-)(\b[\w:]+|\"[\-\s\w:]+\"\b)/).select { |match| match.first != 'OR' }.size > MAX_POSITIVE_TERMS
|
187
|
-
end
|
188
|
-
|
189
|
-
# Does the rule value contain too many negative terms ?
|
190
|
-
def too_many_negative_terms?
|
191
|
-
return false if long?
|
192
|
-
@value.scan(/(^| )\-(\w|\([^(]*\)|\"[^"]*\")/).size > MAX_NEGATIVE_TERMS
|
193
|
-
end
|
194
|
-
|
195
136
|
# Does the rule value contain an empty source ?
|
196
137
|
def contains_empty_source?
|
197
138
|
!@value[/source\:\s/].nil?
|
@@ -17,13 +17,9 @@ module PowerTrack
|
|
17
17
|
# Includes a logger, void by default
|
18
18
|
include VoidLogger::LoggerMixin
|
19
19
|
|
20
|
-
# The format of the
|
21
|
-
|
22
|
-
|
23
|
-
v1: "https://%s.gnip.com/accounts/%s/publishers/%s/%s/track/%s%s.json".freeze,
|
24
|
-
# [ hostname, domain, feature, stream type, account, source, label, sub-feature ]
|
25
|
-
v2: "https://gnip-%s.%s.com/%s/%s/accounts/%s/publishers/%s/%s%s.json".freeze
|
26
|
-
}.freeze
|
20
|
+
# The format of the URL to connect to the stream service
|
21
|
+
# [ hostname, domain, feature, stream type, account, source, label, sub-feature ]
|
22
|
+
FEATURE_URL_FORMAT = 'https://gnip-%s.%s.com/%s/%s/accounts/%s/publishers/%s/%s%s.json'.freeze
|
27
23
|
|
28
24
|
# The default timeout on a connection to PowerTrack. Can be overriden per call.
|
29
25
|
DEFAULT_CONNECTION_TIMEOUT = 30
|
@@ -34,14 +30,10 @@ module PowerTrack
|
|
34
30
|
|
35
31
|
# The default options for using the stream.
|
36
32
|
DEFAULT_STREAM_OPTIONS = {
|
37
|
-
# enable PowerTrack v2 API (using v1 by default)
|
38
|
-
v2: false,
|
39
33
|
# override the default connection timeout
|
40
34
|
connect_timeout: DEFAULT_CONNECTION_TIMEOUT,
|
41
35
|
# override the default inactivity timeout
|
42
36
|
inactivity_timeout: DEFAULT_INACTIVITY_TIMEOUT,
|
43
|
-
# use a client id if you want to leverage the Backfill feature in v1
|
44
|
-
client_id: nil,
|
45
37
|
# enable the replay mode to get activities over the last 5 days
|
46
38
|
# see http://support.gnip.com/apis/replay/api_reference.html
|
47
39
|
replay: false
|
@@ -67,13 +59,6 @@ module PowerTrack
|
|
67
59
|
@label = label
|
68
60
|
@options = DEFAULT_STREAM_OPTIONS.merge(options || {})
|
69
61
|
@replay = !!@options[:replay]
|
70
|
-
@client_id = @options[:client_id]
|
71
|
-
@v2 = !!@options[:v2]
|
72
|
-
end
|
73
|
-
|
74
|
-
# Returns true if the stream uses PowerTrack v2
|
75
|
-
def v2?
|
76
|
-
@v2
|
77
62
|
end
|
78
63
|
|
79
64
|
# Adds many rules to your PowerTrack stream’s ruleset.
|
@@ -95,11 +80,11 @@ module PowerTrack
|
|
95
80
|
# See http://support.gnip.com/apis/powertrack/api_reference.html#DeleteRules
|
96
81
|
def delete_rules(*rules)
|
97
82
|
# v2 does not use DELETE anymore
|
98
|
-
delete_verb =
|
83
|
+
delete_verb = :post
|
99
84
|
# flatten the rules in case it was provided as an array
|
100
85
|
delete_options = { body: MultiJson.encode('rules' => rules.flatten) }
|
101
86
|
# v2 uses a query parameter
|
102
|
-
delete_options[:query] = { '_method' => 'delete' }
|
87
|
+
delete_options[:query] = { '_method' => 'delete' }
|
103
88
|
|
104
89
|
make_rules_request(delete_verb, delete_options)
|
105
90
|
end
|
@@ -149,7 +134,7 @@ module PowerTrack
|
|
149
134
|
from: nil,
|
150
135
|
# the ending date to which the activities will be recovered (replay mode only)
|
151
136
|
to: nil,
|
152
|
-
# specify a number of minutes to leverage the Backfill feature
|
137
|
+
# specify a number of minutes to leverage the Backfill feature
|
153
138
|
backfill_minutes: nil,
|
154
139
|
# called for each message received, except heartbeats
|
155
140
|
on_message: nil,
|
@@ -181,39 +166,21 @@ module PowerTrack
|
|
181
166
|
|
182
167
|
# Returns the URL of the stream for a given feature.
|
183
168
|
def feature_url(hostname, feature=nil, sub_feature=nil)
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
@label,
|
200
|
-
sub_feature ]
|
201
|
-
else
|
202
|
-
feature = feature ? "/#{feature}" : ''
|
203
|
-
mode = @replay ? 'replay' : 'streams'
|
204
|
-
|
205
|
-
_url = FEATURE_URL_FORMAT[:v1] %
|
206
|
-
[ hostname,
|
207
|
-
@account_name,
|
208
|
-
@data_source,
|
209
|
-
mode,
|
210
|
-
@label,
|
211
|
-
feature ]
|
212
|
-
|
213
|
-
_url += "?client=#{@client_id}" if @client_id
|
214
|
-
end
|
215
|
-
|
216
|
-
_url
|
169
|
+
feature ||= @replay ? 'replay' : hostname
|
170
|
+
sub_feature = sub_feature ? "/#{sub_feature}" : ''
|
171
|
+
stream_type = (feature == 'rules' && @replay ? 'powertrack-replay' : 'powertrack')
|
172
|
+
# replay streaming is on gnip.com while replay rules are on twitter.com...
|
173
|
+
domain = (feature == 'replay' && @replay ? 'gnip' : 'twitter')
|
174
|
+
|
175
|
+
FEATURE_URL_FORMAT %
|
176
|
+
[ hostname,
|
177
|
+
domain,
|
178
|
+
feature,
|
179
|
+
stream_type,
|
180
|
+
@account_name,
|
181
|
+
@data_source,
|
182
|
+
@label,
|
183
|
+
sub_feature ]
|
217
184
|
end
|
218
185
|
|
219
186
|
# Returns the HTTP header that turns on GZip-based compression if required.
|
@@ -396,7 +363,7 @@ module PowerTrack
|
|
396
363
|
logger.info "Replay mode enabled from '#{from}' to '#{to}'"
|
397
364
|
end
|
398
365
|
|
399
|
-
if
|
366
|
+
if backfill_minutes
|
400
367
|
get_opts[:query]['backfillMinutes'] = backfill_minutes
|
401
368
|
end
|
402
369
|
|
data/lib/powertrack/version.rb
CHANGED
data/test/minitest_helper.rb
CHANGED
@@ -30,14 +30,13 @@ class Minitest::Test
|
|
30
30
|
end
|
31
31
|
|
32
32
|
# Returns a brand-new stream based on the config found in test/powertrack.yml.
|
33
|
-
def new_stream(
|
33
|
+
def new_stream(replay=false)
|
34
34
|
PowerTrack::Stream.new(
|
35
35
|
powertrack_config[:username],
|
36
36
|
powertrack_config[:password],
|
37
37
|
powertrack_config[:account_name],
|
38
38
|
powertrack_config[:data_source],
|
39
39
|
replay ? 'prod' : powertrack_config[:stream_label],
|
40
|
-
replay: replay
|
41
|
-
v2: v2)
|
40
|
+
replay: replay)
|
42
41
|
end
|
43
42
|
end
|
data/test/test_manage_rules.rb
CHANGED
@@ -4,24 +4,16 @@ require 'multi_json'
|
|
4
4
|
|
5
5
|
class TestManageRules < Minitest::Test
|
6
6
|
|
7
|
-
def
|
8
|
-
add_then_delete_a_single_rule(false
|
7
|
+
def test_add_then_delete_a_single_rule
|
8
|
+
add_then_delete_a_single_rule(false)
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
12
|
-
add_then_delete_a_single_rule(true
|
11
|
+
def test_add_then_delete_a_single_rule_in_replay_mode
|
12
|
+
add_then_delete_a_single_rule(true)
|
13
13
|
end
|
14
14
|
|
15
|
-
def
|
16
|
-
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_add_then_delete_a_single_rule_in_replay_mode_v2
|
20
|
-
add_then_delete_a_single_rule(true, true)
|
21
|
-
end
|
22
|
-
|
23
|
-
def add_then_delete_a_single_rule(v2, replay)
|
24
|
-
stream = new_stream(v2, replay)
|
15
|
+
def add_then_delete_a_single_rule(replay)
|
16
|
+
stream = new_stream(replay)
|
25
17
|
|
26
18
|
# add a logger
|
27
19
|
stream.logger = Logger.new(STDERR)
|
@@ -32,30 +24,26 @@ class TestManageRules < Minitest::Test
|
|
32
24
|
pre_existing_rules = stream.list_rules
|
33
25
|
$stderr.puts pre_existing_rules.inspect
|
34
26
|
assert pre_existing_rules.is_a?(Array)
|
35
|
-
assert pre_existing_rules.all? { |rule| !rule.id.nil? }
|
27
|
+
assert pre_existing_rules.all? { |rule| !rule.id.nil? }
|
36
28
|
|
37
29
|
already_in = pre_existing_rules.any? { |rule| new_rule == rule }
|
38
30
|
|
39
31
|
res = stream.add_rule(new_rule)
|
40
32
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
assert_equal 1, res['summary']['not_created']
|
48
|
-
else
|
49
|
-
assert_equal 1, res['summary']['created']
|
50
|
-
assert_equal 0, res['summary']['not_created']
|
51
|
-
end
|
33
|
+
assert res.is_a?(Hash)
|
34
|
+
assert res['summary'].is_a?(Hash)
|
35
|
+
|
36
|
+
if already_in
|
37
|
+
assert_equal 0, res['summary']['created']
|
38
|
+
assert_equal 1, res['summary']['not_created']
|
52
39
|
else
|
53
|
-
|
40
|
+
assert_equal 1, res['summary']['created']
|
41
|
+
assert_equal 0, res['summary']['not_created']
|
54
42
|
end
|
55
43
|
|
56
44
|
rules_after_addition = stream.list_rules
|
57
45
|
assert rules_after_addition.is_a?(Array)
|
58
|
-
assert rules_after_addition.all? { |rule| !rule.id.nil? }
|
46
|
+
assert rules_after_addition.all? { |rule| !rule.id.nil? }
|
59
47
|
|
60
48
|
if already_in
|
61
49
|
assert_equal pre_existing_rules.size, rules_after_addition.size
|
@@ -67,19 +55,15 @@ class TestManageRules < Minitest::Test
|
|
67
55
|
|
68
56
|
res = stream.delete_rules(new_rule)
|
69
57
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
assert_equal 0, res['summary']['not_deleted']
|
75
|
-
else
|
76
|
-
assert_nil res
|
77
|
-
end
|
58
|
+
assert res.is_a?(Hash)
|
59
|
+
assert res['summary'].is_a?(Hash)
|
60
|
+
assert_equal 1, res['summary']['deleted']
|
61
|
+
assert_equal 0, res['summary']['not_deleted']
|
78
62
|
|
79
63
|
rules_after_removal = stream.list_rules
|
80
64
|
assert rules_after_removal.is_a?(Array)
|
81
65
|
assert_equal rules_after_addition.size - 1, rules_after_removal.size
|
82
66
|
assert_equal [], rules_after_removal - rules_after_addition
|
83
|
-
assert rules_after_removal.all? { |rule| !rule.id.nil? }
|
67
|
+
assert rules_after_removal.all? { |rule| !rule.id.nil? }
|
84
68
|
end
|
85
69
|
end
|
data/test/test_rule.rb
CHANGED
@@ -8,220 +8,71 @@ class TestRule < Minitest::Test
|
|
8
8
|
rule = PowerTrack::Rule.new('coke')
|
9
9
|
assert_equal 'coke', rule.value
|
10
10
|
assert_nil rule.tag
|
11
|
-
assert !rule.long?
|
12
11
|
assert rule.valid?
|
13
12
|
assert_nil rule.error
|
14
13
|
|
15
|
-
|
16
|
-
assert_equal '
|
17
|
-
assert_equal 'soda',
|
18
|
-
assert
|
19
|
-
|
20
|
-
assert_nil long_rule.error
|
21
|
-
|
22
|
-
v2_rule = PowerTrack::Rule.new('dr pepper', tag: 'soda', v2: true)
|
23
|
-
assert v2_rule.v2?
|
24
|
-
assert_equal 'dr pepper', v2_rule.value
|
25
|
-
assert_equal 'soda', v2_rule.tag
|
26
|
-
assert v2_rule.long?
|
27
|
-
assert v2_rule.valid?
|
28
|
-
assert_nil v2_rule.error
|
14
|
+
tagged_rule = PowerTrack::Rule.new('dr pepper', tag: 'soda')
|
15
|
+
assert_equal 'dr pepper', tagged_rule.value
|
16
|
+
assert_equal 'soda', tagged_rule.tag
|
17
|
+
assert tagged_rule.valid?
|
18
|
+
assert_nil tagged_rule.error
|
29
19
|
end
|
30
20
|
|
31
21
|
def test_too_long_tag
|
32
22
|
long_tag = 'a' * PowerTrack::Rule::MAX_TAG_LENGTH
|
33
|
-
rule = PowerTrack::Rule.new('coke', tag: long_tag
|
23
|
+
rule = PowerTrack::Rule.new('coke', tag: long_tag)
|
34
24
|
assert rule.valid?
|
35
25
|
assert_nil rule.error
|
36
26
|
|
37
27
|
long_tag = 'b' * 2 * PowerTrack::Rule::MAX_TAG_LENGTH
|
38
|
-
rule = PowerTrack::Rule.new('coke', tag: long_tag
|
28
|
+
rule = PowerTrack::Rule.new('coke', tag: long_tag)
|
39
29
|
assert !rule.valid?
|
40
30
|
assert_match /too long tag/i, rule.error
|
41
31
|
end
|
42
32
|
|
43
33
|
def test_too_long_value
|
44
|
-
long_val = 'a' * PowerTrack::Rule::
|
45
|
-
|
34
|
+
long_val = 'a' * PowerTrack::Rule::MAX_RULE_VALUE_LENGTH
|
35
|
+
|
46
36
|
rule = PowerTrack::Rule.new(long_val)
|
47
37
|
assert rule.valid?
|
38
|
+
assert_nil rule.error
|
48
39
|
|
49
|
-
|
50
|
-
v2_rule = PowerTrack::Rule.new(long_val, v2: true)
|
51
|
-
assert v2_rule.v2?
|
52
|
-
assert v2_rule.valid?
|
53
|
-
assert_nil v2_rule.error
|
54
|
-
|
55
|
-
long_val = 'c' * PowerTrack::Rule::MAX_LONG_RULE_VALUE_LENGTH
|
56
|
-
# v1
|
57
|
-
rule = long_val.to_pwtk_rule(long: false)
|
58
|
-
assert !rule.valid?
|
59
|
-
assert_match /too long value/i, rule.error
|
60
|
-
|
40
|
+
long_val = 'c' * PowerTrack::Rule::MAX_RULE_VALUE_LENGTH
|
61
41
|
assert long_val.to_pwtk_rule.valid?
|
62
|
-
assert long_val.to_pwtk_rule(long: true).valid?
|
63
|
-
|
64
|
-
# v2
|
65
|
-
assert long_val.to_pwtk_rule(v2: true).valid?
|
66
|
-
assert long_val.to_pwtk_rule(long: false, v2: true).valid?
|
67
42
|
|
68
|
-
very_long_val = 'rrr' * PowerTrack::Rule::
|
69
|
-
# v1
|
43
|
+
very_long_val = 'rrr' * PowerTrack::Rule::MAX_RULE_VALUE_LENGTH
|
70
44
|
rule = very_long_val.to_pwtk_rule
|
71
45
|
assert !rule.valid?
|
72
46
|
assert_match /too long value/i, rule.error
|
73
|
-
|
74
|
-
# v2
|
75
|
-
v2_rule = very_long_val.to_pwtk_rule(v2: true)
|
76
|
-
assert v2_rule.v2?
|
77
|
-
assert !v2_rule.valid?
|
78
|
-
assert_match /too long value/i, v2_rule.error
|
79
|
-
end
|
80
|
-
|
81
|
-
def test_too_many_positive_terms
|
82
|
-
phrase = ([ 'coke' ] * PowerTrack::Rule::MAX_POSITIVE_TERMS).join(' ')
|
83
|
-
rule = PowerTrack::Rule.new(phrase)
|
84
|
-
assert !rule.long?
|
85
|
-
assert rule.valid?
|
86
|
-
assert_nil rule.error
|
87
|
-
|
88
|
-
long_rule = PowerTrack::Rule.new(phrase, long: true)
|
89
|
-
assert long_rule.long?
|
90
|
-
assert long_rule.valid?
|
91
|
-
assert_nil long_rule.error
|
92
|
-
|
93
|
-
# v2
|
94
|
-
v2_rule = PowerTrack::Rule.new(phrase, v2: true)
|
95
|
-
assert v2_rule.v2?
|
96
|
-
assert v2_rule.long?
|
97
|
-
assert v2_rule.valid?
|
98
|
-
assert_nil v2_rule.error
|
99
|
-
|
100
|
-
phrase = ([ 'coke' ] * (2 * PowerTrack::Rule::MAX_POSITIVE_TERMS)).join(' ')
|
101
|
-
# v1
|
102
|
-
rule = PowerTrack::Rule.new(phrase, long: false)
|
103
|
-
assert !rule.long?
|
104
|
-
assert !rule.valid?
|
105
|
-
assert_match /too many positive terms/i, rule.error
|
106
|
-
# v2
|
107
|
-
v2_rule = PowerTrack::Rule.new(phrase, v2: true)
|
108
|
-
assert v2_rule.v2?
|
109
|
-
assert v2_rule.long?
|
110
|
-
assert v2_rule.valid?
|
111
|
-
assert_nil v2_rule.error
|
112
|
-
|
113
|
-
long_rule = PowerTrack::Rule.new(phrase, long: true)
|
114
|
-
assert long_rule.long?
|
115
|
-
assert long_rule.valid?
|
116
|
-
assert_nil long_rule.error
|
117
|
-
|
118
|
-
phrase = "from:lkv1csayp OR from:u42vf OR from:y OR from:groj OR from:69iqciuxlxerqq OR from:4 OR from:9832xjrqi1ncrs OR from:7kfss6jxtl0oj OR from:b31m9qf0u3tc OR from:0 OR from:abo59n OR from:3lma3kl OR from:5 OR from:ovw7bgov OR from:ubp OR from:gc9a6b OR from:jo7ootfvy4 OR from:sg7oohj OR from:349ankku OR from:9b72n OR from:qz7offt5019u OR from:gkd OR from:cc31p3 OR from:xws9 OR from:bjzbatm OR from:rwjm78cgre3j5 OR from:f1obak7w3w OR from:nontf OR from:4aeas6kgb7nia OR from:dzqy7"
|
119
|
-
long_rule = PowerTrack::Rule.new(phrase)
|
120
|
-
assert !long_rule.long?
|
121
|
-
assert long_rule.valid?, long_rule.error
|
122
|
-
assert_nil long_rule.error
|
123
|
-
|
124
|
-
long_rule = PowerTrack::Rule.new(phrase + " OR from:michel")
|
125
|
-
assert !rule.valid?
|
126
|
-
assert_match /too many positive terms/i, rule.error
|
127
|
-
|
128
|
-
v2_rule = PowerTrack::Rule.new(phrase + " OR from:michel", v2: true)
|
129
|
-
assert v2_rule.v2?
|
130
|
-
assert v2_rule.valid?
|
131
|
-
assert_nil v2_rule.error
|
132
|
-
end
|
133
|
-
|
134
|
-
def test_too_many_negative_terms
|
135
|
-
phrase = ([ '-pepsi' ] * PowerTrack::Rule::MAX_POSITIVE_TERMS).join(' ')
|
136
|
-
rule = PowerTrack::Rule.new(phrase)
|
137
|
-
assert !rule.long?
|
138
|
-
assert rule.valid?
|
139
|
-
assert_nil rule.error
|
140
|
-
|
141
|
-
long_rule = PowerTrack::Rule.new(phrase, long: true)
|
142
|
-
assert long_rule.long?
|
143
|
-
assert long_rule.valid?
|
144
|
-
assert_nil long_rule.error
|
145
|
-
|
146
|
-
v2_rule = PowerTrack::Rule.new(phrase, v2: true)
|
147
|
-
assert v2_rule.v2?
|
148
|
-
assert v2_rule.long?
|
149
|
-
assert v2_rule.valid?
|
150
|
-
assert_nil v2_rule.error
|
151
|
-
|
152
|
-
phrase = ([ '-pepsi' ] * (2 * PowerTrack::Rule::MAX_POSITIVE_TERMS)).join(' ')
|
153
|
-
rule = PowerTrack::Rule.new(phrase)
|
154
|
-
assert !rule.long?
|
155
|
-
assert !rule.valid?
|
156
|
-
assert_match /too many negative terms/i, rule.error
|
157
|
-
|
158
|
-
long_rule = PowerTrack::Rule.new(phrase, long: true)
|
159
|
-
assert long_rule.long?
|
160
|
-
assert long_rule.valid?
|
161
|
-
assert_nil long_rule.error
|
162
|
-
|
163
|
-
v2_rule = PowerTrack::Rule.new(phrase, v2: true)
|
164
|
-
assert v2_rule.v2?
|
165
|
-
assert v2_rule.long?
|
166
|
-
assert v2_rule.valid?
|
167
|
-
assert_nil v2_rule.error
|
168
47
|
end
|
169
48
|
|
170
49
|
def test_contains_negated_or
|
171
50
|
phrase = 'coke OR -pepsi'
|
172
51
|
rule = PowerTrack::Rule.new(phrase)
|
173
|
-
assert !rule.long?
|
174
52
|
assert !rule.valid?
|
175
53
|
assert_match /contains negated or/i, rule.error
|
176
|
-
|
177
|
-
v2_rule = PowerTrack::Rule.new(phrase, v2: true)
|
178
|
-
assert v2_rule.v2?
|
179
|
-
assert v2_rule.long?
|
180
|
-
assert !v2_rule.valid?
|
181
|
-
assert_match /contains negated or/i, v2_rule.error
|
182
54
|
end
|
183
55
|
|
184
56
|
def test_contains_explicit_and
|
185
57
|
phrase = 'coke AND pepsi'
|
186
58
|
rule = PowerTrack::Rule.new(phrase)
|
187
|
-
assert !rule.
|
188
|
-
|
189
|
-
assert_nil rule.error
|
190
|
-
|
191
|
-
v2_rule = PowerTrack::Rule.new(phrase, v2: true)
|
192
|
-
assert v2_rule.v2?
|
193
|
-
assert v2_rule.long?
|
194
|
-
assert !v2_rule.valid?
|
195
|
-
assert_match /contains explicit and/i, v2_rule.error
|
59
|
+
assert !rule.valid?
|
60
|
+
assert_match /contains explicit and/i, rule.error
|
196
61
|
end
|
197
62
|
|
198
63
|
def test_contains_explicit_not
|
199
64
|
[ 'coke NOT pepsi', 'NOT (pepsi OR "dr pepper")' ].each do |phrase|
|
200
65
|
rule = PowerTrack::Rule.new(phrase)
|
201
|
-
assert !rule.
|
202
|
-
|
203
|
-
assert_nil rule.error
|
204
|
-
|
205
|
-
v2_rule = PowerTrack::Rule.new(phrase, v2: true)
|
206
|
-
assert v2_rule.v2?
|
207
|
-
assert v2_rule.long?
|
208
|
-
assert !v2_rule.valid?
|
209
|
-
assert_match /contains explicit not/i, v2_rule.error
|
66
|
+
assert !rule.valid?
|
67
|
+
assert_match /contains explicit not/i, rule.error
|
210
68
|
end
|
211
69
|
end
|
212
70
|
|
213
71
|
def test_contains_lowercase_or
|
214
72
|
phrase = 'coke or pepsi'
|
215
73
|
rule = PowerTrack::Rule.new(phrase)
|
216
|
-
assert !rule.
|
217
|
-
|
218
|
-
assert_nil rule.error
|
219
|
-
|
220
|
-
v2_rule = PowerTrack::Rule.new(phrase, v2: true)
|
221
|
-
assert v2_rule.v2?
|
222
|
-
assert v2_rule.long?
|
223
|
-
assert !v2_rule.valid?
|
224
|
-
assert_match /contains lowercase or/i, v2_rule.error
|
74
|
+
assert !rule.valid?
|
75
|
+
assert_match /contains lowercase or/i, rule.error
|
225
76
|
end
|
226
77
|
|
227
78
|
def test_to_hash_and_json
|
@@ -231,7 +82,7 @@ class TestRule < Minitest::Test
|
|
231
82
|
assert_equal MultiJson.encode(res), rule.to_json
|
232
83
|
|
233
84
|
res[:tag] = 'soda'
|
234
|
-
rule = PowerTrack::Rule.new(res[:value], tag: res[:tag]
|
85
|
+
rule = PowerTrack::Rule.new(res[:value], tag: res[:tag])
|
235
86
|
assert_equal res, rule.to_hash
|
236
87
|
assert_equal MultiJson.encode(res), rule.to_json
|
237
88
|
end
|
@@ -247,22 +98,12 @@ class TestRule < Minitest::Test
|
|
247
98
|
|
248
99
|
def test_hash
|
249
100
|
short_rule = PowerTrack::Rule.new('coke')
|
250
|
-
not_long_rule = PowerTrack::Rule.new('coke', long: false)
|
251
|
-
false_long_rule = PowerTrack::Rule.new('coke', long: true)
|
252
101
|
short_rule_with_tag = PowerTrack::Rule.new('coke', tag: 'soda')
|
253
102
|
|
254
|
-
assert short_rule == not_long_rule
|
255
|
-
assert_equal short_rule, not_long_rule
|
256
|
-
assert_equal short_rule.hash, not_long_rule.hash
|
257
|
-
|
258
|
-
assert short_rule != false_long_rule
|
259
103
|
h = { short_rule => 1 }
|
260
|
-
h[not_long_rule] = 2
|
261
|
-
h[false_long_rule] = 3
|
262
104
|
h[short_rule_with_tag] = 4
|
263
105
|
|
264
|
-
assert_equal
|
265
|
-
assert_equal h[short_rule], h[not_long_rule]
|
106
|
+
assert_equal 1, h[short_rule]
|
266
107
|
assert_equal 4, h[short_rule_with_tag]
|
267
108
|
assert_nil h[PowerTrack::Rule.new('pepsi', tag: 'soda')]
|
268
109
|
end
|
data/test/test_track_stream.rb
CHANGED
@@ -4,25 +4,16 @@ require 'multi_json'
|
|
4
4
|
|
5
5
|
class TestTrackStream < Minitest::Test
|
6
6
|
|
7
|
-
def
|
8
|
-
track_simple_stream(false
|
7
|
+
def test_track_realtime_stream
|
8
|
+
track_simple_stream(false)
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
12
|
-
track_simple_stream(true
|
11
|
+
def test_track_replay_stream
|
12
|
+
track_simple_stream(true)
|
13
13
|
end
|
14
14
|
|
15
|
-
def
|
16
|
-
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_track_replay_stream_v2
|
20
|
-
track_simple_stream(true, true)
|
21
|
-
end
|
22
|
-
|
23
|
-
def track_simple_stream(v2, replay)
|
24
|
-
stream = new_stream(v2, replay)
|
25
|
-
assert_equal !!v2, stream.v2?
|
15
|
+
def track_simple_stream(replay)
|
16
|
+
stream = new_stream(replay)
|
26
17
|
|
27
18
|
# add a logger
|
28
19
|
stream.logger = Logger.new(STDERR)
|
@@ -33,18 +24,14 @@ class TestTrackStream < Minitest::Test
|
|
33
24
|
begin
|
34
25
|
res = stream.add_rule(new_rule)
|
35
26
|
|
36
|
-
|
37
|
-
|
38
|
-
assert res['summary'].is_a?(Hash)
|
39
|
-
else
|
40
|
-
assert_nil res
|
41
|
-
end
|
27
|
+
assert res.is_a?(Hash)
|
28
|
+
assert res['summary'].is_a?(Hash)
|
42
29
|
|
43
30
|
rules_after_addition = stream.list_rules
|
44
31
|
assert rules_after_addition.is_a?(Array)
|
45
32
|
assert rules_after_addition.size > 0
|
46
33
|
assert rules_after_addition.any? { |rule| rule == new_rule }
|
47
|
-
assert rules_after_addition.all? { |rule| !rule.id.nil? }
|
34
|
+
assert rules_after_addition.all? { |rule| !rule.id.nil? }
|
48
35
|
|
49
36
|
heartbeats = 0
|
50
37
|
received = 0
|
@@ -106,8 +93,12 @@ class TestTrackStream < Minitest::Test
|
|
106
93
|
end
|
107
94
|
|
108
95
|
# heartbeats only sent every 10 minutes in v2...
|
109
|
-
|
110
|
-
|
96
|
+
unless replay
|
97
|
+
assert_equal 0, heartbeats, "Unexpected #{heartbeats} heartbeats received"
|
98
|
+
else
|
99
|
+
assert heartbeats > 0, 'No heartbeats received so far'
|
100
|
+
puts "#{heartbeats} heartbeats received"
|
101
|
+
end
|
111
102
|
|
112
103
|
assert received > 0, 'No message received so far'
|
113
104
|
puts "#{received} messages received"
|
@@ -119,14 +110,10 @@ class TestTrackStream < Minitest::Test
|
|
119
110
|
ensure
|
120
111
|
res = stream.delete_rules(new_rule)
|
121
112
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
assert_equal 0, res['summary']['not_deleted']
|
127
|
-
else
|
128
|
-
assert_nil res
|
129
|
-
end
|
113
|
+
assert res.is_a?(Hash)
|
114
|
+
assert res['summary'].is_a?(Hash)
|
115
|
+
assert_equal 1, res['summary']['deleted']
|
116
|
+
assert_equal 0, res['summary']['not_deleted']
|
130
117
|
end
|
131
118
|
end
|
132
119
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: powertrack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Laurent Farcy
|
@@ -10,134 +10,132 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2018-01-05 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
17
17
|
requirement: !ruby/object:Gem::Requirement
|
18
18
|
requirements:
|
19
|
-
- - ~>
|
19
|
+
- - "~>"
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: '1.7'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
|
-
- - ~>
|
26
|
+
- - "~>"
|
27
27
|
- !ruby/object:Gem::Version
|
28
28
|
version: '1.7'
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: rake
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
|
-
- - ~>
|
33
|
+
- - "~>"
|
34
34
|
- !ruby/object:Gem::Version
|
35
35
|
version: '10.3'
|
36
36
|
type: :development
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
|
-
- - ~>
|
40
|
+
- - "~>"
|
41
41
|
- !ruby/object:Gem::Version
|
42
42
|
version: '10.3'
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
44
|
name: minitest
|
45
45
|
requirement: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
|
-
- - ~>
|
47
|
+
- - "~>"
|
48
48
|
- !ruby/object:Gem::Version
|
49
49
|
version: '5.5'
|
50
50
|
type: :development
|
51
51
|
prerelease: false
|
52
52
|
version_requirements: !ruby/object:Gem::Requirement
|
53
53
|
requirements:
|
54
|
-
- - ~>
|
54
|
+
- - "~>"
|
55
55
|
- !ruby/object:Gem::Version
|
56
56
|
version: '5.5'
|
57
57
|
- !ruby/object:Gem::Dependency
|
58
58
|
name: ruby-prof
|
59
59
|
requirement: !ruby/object:Gem::Requirement
|
60
60
|
requirements:
|
61
|
-
- - ~>
|
61
|
+
- - "~>"
|
62
62
|
- !ruby/object:Gem::Version
|
63
63
|
version: '0.15'
|
64
64
|
type: :development
|
65
65
|
prerelease: false
|
66
66
|
version_requirements: !ruby/object:Gem::Requirement
|
67
67
|
requirements:
|
68
|
-
- - ~>
|
68
|
+
- - "~>"
|
69
69
|
- !ruby/object:Gem::Version
|
70
70
|
version: '0.15'
|
71
71
|
- !ruby/object:Gem::Dependency
|
72
72
|
name: multi_json
|
73
73
|
requirement: !ruby/object:Gem::Requirement
|
74
74
|
requirements:
|
75
|
-
- - ~>
|
75
|
+
- - "~>"
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '1.11'
|
78
78
|
type: :runtime
|
79
79
|
prerelease: false
|
80
80
|
version_requirements: !ruby/object:Gem::Requirement
|
81
81
|
requirements:
|
82
|
-
- - ~>
|
82
|
+
- - "~>"
|
83
83
|
- !ruby/object:Gem::Version
|
84
84
|
version: '1.11'
|
85
85
|
- !ruby/object:Gem::Dependency
|
86
86
|
name: eventmachine
|
87
87
|
requirement: !ruby/object:Gem::Requirement
|
88
88
|
requirements:
|
89
|
-
- - ~>
|
89
|
+
- - "~>"
|
90
90
|
- !ruby/object:Gem::Version
|
91
|
-
version:
|
92
|
-
MS4w
|
91
|
+
version: '1.0'
|
93
92
|
type: :runtime
|
94
93
|
prerelease: false
|
95
94
|
version_requirements: !ruby/object:Gem::Requirement
|
96
95
|
requirements:
|
97
|
-
- - ~>
|
96
|
+
- - "~>"
|
98
97
|
- !ruby/object:Gem::Version
|
99
|
-
version:
|
100
|
-
MS4w
|
98
|
+
version: '1.0'
|
101
99
|
- !ruby/object:Gem::Dependency
|
102
100
|
name: em-http-request
|
103
101
|
requirement: !ruby/object:Gem::Requirement
|
104
102
|
requirements:
|
105
|
-
- - ~>
|
103
|
+
- - "~>"
|
106
104
|
- !ruby/object:Gem::Version
|
107
105
|
version: '1.1'
|
108
106
|
type: :runtime
|
109
107
|
prerelease: false
|
110
108
|
version_requirements: !ruby/object:Gem::Requirement
|
111
109
|
requirements:
|
112
|
-
- - ~>
|
110
|
+
- - "~>"
|
113
111
|
- !ruby/object:Gem::Version
|
114
112
|
version: '1.1'
|
115
113
|
- !ruby/object:Gem::Dependency
|
116
114
|
name: exponential-backoff
|
117
115
|
requirement: !ruby/object:Gem::Requirement
|
118
116
|
requirements:
|
119
|
-
- - ~>
|
117
|
+
- - "~>"
|
120
118
|
- !ruby/object:Gem::Version
|
121
119
|
version: 0.0.2
|
122
120
|
type: :runtime
|
123
121
|
prerelease: false
|
124
122
|
version_requirements: !ruby/object:Gem::Requirement
|
125
123
|
requirements:
|
126
|
-
- - ~>
|
124
|
+
- - "~>"
|
127
125
|
- !ruby/object:Gem::Version
|
128
126
|
version: 0.0.2
|
129
127
|
- !ruby/object:Gem::Dependency
|
130
128
|
name: void_logger
|
131
129
|
requirement: !ruby/object:Gem::Requirement
|
132
130
|
requirements:
|
133
|
-
- - ~>
|
131
|
+
- - "~>"
|
134
132
|
- !ruby/object:Gem::Version
|
135
133
|
version: '0.1'
|
136
134
|
type: :runtime
|
137
135
|
prerelease: false
|
138
136
|
version_requirements: !ruby/object:Gem::Requirement
|
139
137
|
requirements:
|
140
|
-
- - ~>
|
138
|
+
- - "~>"
|
141
139
|
- !ruby/object:Gem::Version
|
142
140
|
version: '0.1'
|
143
141
|
description: Powertrack is a gem used to develop GNIP PowerTrack streaming clients.
|
@@ -149,8 +147,8 @@ executables: []
|
|
149
147
|
extensions: []
|
150
148
|
extra_rdoc_files: []
|
151
149
|
files:
|
152
|
-
- .gitignore
|
153
|
-
- .travis.yml
|
150
|
+
- ".gitignore"
|
151
|
+
- ".travis.yml"
|
154
152
|
- Gemfile
|
155
153
|
- Gemfile.lock
|
156
154
|
- History.txt
|
@@ -183,17 +181,17 @@ require_paths:
|
|
183
181
|
- lib
|
184
182
|
required_ruby_version: !ruby/object:Gem::Requirement
|
185
183
|
requirements:
|
186
|
-
- -
|
184
|
+
- - ">="
|
187
185
|
- !ruby/object:Gem::Version
|
188
186
|
version: '1.9'
|
189
187
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
190
188
|
requirements:
|
191
|
-
- -
|
189
|
+
- - ">="
|
192
190
|
- !ruby/object:Gem::Version
|
193
191
|
version: '0'
|
194
192
|
requirements: []
|
195
193
|
rubyforge_project:
|
196
|
-
rubygems_version: 2.4.
|
194
|
+
rubygems_version: 2.4.8
|
197
195
|
signing_key:
|
198
196
|
specification_version: 4
|
199
197
|
summary: Powertrack is a gem used to develop GNIP PowerTrack streaming clients.
|