powertrack 1.3.1 → 2.0.0
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.
- 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.
|