tweetkit 0.1.1 → 0.2.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 +4 -4
- data/.env.example +5 -0
- data/.gitignore +2 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +21 -0
- data/Gemfile +6 -1
- data/Gemfile.lock +26 -5
- data/LICENSE +21 -0
- data/README.md +6 -4
- data/Rakefile +2 -2
- data/bin/console +19 -0
- data/lib/tweetkit/auth.rb +1 -5
- data/lib/tweetkit/client/response/annotations.rb +0 -0
- data/lib/tweetkit/client/response/attachments.rb +0 -0
- data/lib/tweetkit/client/response/expansions.rb +0 -0
- data/lib/tweetkit/client/response/fields.rb +0 -0
- data/lib/tweetkit/client/response/geo.rb +0 -0
- data/lib/tweetkit/client/response/meta.rb +0 -0
- data/lib/tweetkit/client/response/metrics.rb +0 -0
- data/lib/tweetkit/client/response/response.rb +0 -0
- data/lib/tweetkit/client/response/tweet.rb +0 -0
- data/lib/tweetkit/client/response/tweets.rb +0 -0
- data/lib/tweetkit/client/search/conjunctions.rb +494 -0
- data/lib/tweetkit/client/search/search.rb +23 -0
- data/lib/tweetkit/client/tweets.rb +13 -5
- data/lib/tweetkit/client.rb +0 -1
- data/lib/tweetkit/connection.rb +68 -49
- data/lib/tweetkit/pagination.rb +0 -0
- data/lib/tweetkit/response.rb +585 -62
- data/lib/tweetkit/version.rb +1 -1
- metadata +20 -4
- data/lib/tweetkit/search.rb +0 -121
@@ -0,0 +1,494 @@
|
|
1
|
+
module Conjunctions
|
2
|
+
def contains(*terms)
|
3
|
+
join(terms, connector: ' ')
|
4
|
+
end
|
5
|
+
|
6
|
+
def contains_one(*terms)
|
7
|
+
contains_one_of(*terms)
|
8
|
+
end
|
9
|
+
|
10
|
+
def contains_one_of(*terms)
|
11
|
+
join(terms, connector: ' OR ')
|
12
|
+
end
|
13
|
+
|
14
|
+
def without(*terms)
|
15
|
+
does_not_contain(*terms)
|
16
|
+
end
|
17
|
+
|
18
|
+
def does_not_contain(*terms)
|
19
|
+
join_with_negated_operator(terms)
|
20
|
+
end
|
21
|
+
|
22
|
+
def has(*terms)
|
23
|
+
join_with_operator(terms, connector: ' ', operator: 'has')
|
24
|
+
end
|
25
|
+
|
26
|
+
def has_one(*terms)
|
27
|
+
has_one_of(*terms)
|
28
|
+
end
|
29
|
+
|
30
|
+
def has_one_of(*terms)
|
31
|
+
join_with_operator(terms, connector: ' OR ', operator: 'has')
|
32
|
+
end
|
33
|
+
|
34
|
+
def has_no(*terms)
|
35
|
+
does_not_have(*terms)
|
36
|
+
end
|
37
|
+
|
38
|
+
def does_not_have(*terms)
|
39
|
+
join_with_operator(terms, connector: ' ', operator: '-has')
|
40
|
+
end
|
41
|
+
|
42
|
+
def is_a(*terms)
|
43
|
+
is(*terms)
|
44
|
+
end
|
45
|
+
|
46
|
+
def is(*terms)
|
47
|
+
join_with_operator(terms, connector: ' ', operator: 'is')
|
48
|
+
end
|
49
|
+
|
50
|
+
def is_one_of(*terms)
|
51
|
+
join_with_operator(terms, connector: ' OR ', operator: 'is')
|
52
|
+
end
|
53
|
+
|
54
|
+
def is_not(*terms)
|
55
|
+
join_with_operator(terms, connector: ' ', operator: '-is')
|
56
|
+
end
|
57
|
+
|
58
|
+
def from(*terms)
|
59
|
+
join_with_operator(terms, connector: ' ', operator: 'from')
|
60
|
+
end
|
61
|
+
|
62
|
+
def from_one(*terms)
|
63
|
+
from_one_of(*terms)
|
64
|
+
end
|
65
|
+
|
66
|
+
def from_one_of(*terms)
|
67
|
+
join_with_operator(terms, connector: ' OR ', operator: 'from')
|
68
|
+
end
|
69
|
+
|
70
|
+
def not_from(*terms)
|
71
|
+
is_not_from(*terms)
|
72
|
+
end
|
73
|
+
|
74
|
+
def is_not_from(*terms)
|
75
|
+
join_with_operator(terms, connector: ' ', operator: '-from')
|
76
|
+
end
|
77
|
+
|
78
|
+
def to(*terms)
|
79
|
+
join_with_operator(terms, connector: ' ', operator: 'to')
|
80
|
+
end
|
81
|
+
|
82
|
+
def to_one_of(*terms)
|
83
|
+
join_with_operator(terms, connector: ' OR ', operator: 'to')
|
84
|
+
end
|
85
|
+
|
86
|
+
def not_to(*terms)
|
87
|
+
is_not_to(*terms)
|
88
|
+
end
|
89
|
+
|
90
|
+
def is_not_to(*terms)
|
91
|
+
join_with_operator(terms, connector: ' ', operator: '-to')
|
92
|
+
end
|
93
|
+
|
94
|
+
def with_link(term)
|
95
|
+
with_url(term)
|
96
|
+
end
|
97
|
+
|
98
|
+
def with_url(term)
|
99
|
+
return "url:#{term}"
|
100
|
+
end
|
101
|
+
|
102
|
+
def with_links(*terms)
|
103
|
+
with_urls(*terms)
|
104
|
+
end
|
105
|
+
|
106
|
+
def with_urls(*terms)
|
107
|
+
join_with_operator(terms, connector: ' ', operator: 'url')
|
108
|
+
end
|
109
|
+
|
110
|
+
def with_one_of_links(*terms)
|
111
|
+
with_one_of_urls(*terms)
|
112
|
+
end
|
113
|
+
|
114
|
+
def with_one_of_urls(*terms)
|
115
|
+
join_with_operator(terms, connector: ' OR ', operator: 'url')
|
116
|
+
end
|
117
|
+
|
118
|
+
def without_link(term)
|
119
|
+
without_url(term)
|
120
|
+
end
|
121
|
+
|
122
|
+
def without_url(term)
|
123
|
+
return "-url:#{term}"
|
124
|
+
end
|
125
|
+
|
126
|
+
def without_links(*terms)
|
127
|
+
join_with_operator(terms, connector: ' ', operator: '-url')
|
128
|
+
end
|
129
|
+
|
130
|
+
def retweets_of(*terms)
|
131
|
+
join_with_operator(terms, connector: ' ', operator: 'retweets_of')
|
132
|
+
end
|
133
|
+
|
134
|
+
def retweets_of_one_of(*terms)
|
135
|
+
join_with_operator(terms, connector: ' OR ', operator: 'retweets_of')
|
136
|
+
end
|
137
|
+
|
138
|
+
def not_retweets_of(*terms)
|
139
|
+
are_not_retweets_of(*terms)
|
140
|
+
end
|
141
|
+
|
142
|
+
def are_not_retweets_of(*terms)
|
143
|
+
join_with_operator(terms, connector: ' ', operator: '-retweets_of')
|
144
|
+
end
|
145
|
+
|
146
|
+
def with_context(*terms)
|
147
|
+
context(*terms)
|
148
|
+
end
|
149
|
+
|
150
|
+
def context(*terms)
|
151
|
+
join_with_operator(terms, connector: ' ', operator: 'context')
|
152
|
+
end
|
153
|
+
|
154
|
+
def with_one_of_context(*terms)
|
155
|
+
one_of_context(*terms)
|
156
|
+
end
|
157
|
+
|
158
|
+
def one_of_context(*terms)
|
159
|
+
join_with_operator(terms, connector: ' OR ', operator: 'context')
|
160
|
+
end
|
161
|
+
|
162
|
+
def without_context(*terms)
|
163
|
+
not_with_context(*terms)
|
164
|
+
end
|
165
|
+
|
166
|
+
def not_with_context(*terms)
|
167
|
+
join_with_operator(terms, connector: ' ', operator: '-context')
|
168
|
+
end
|
169
|
+
|
170
|
+
def with_entity(*terms)
|
171
|
+
entities(*terms)
|
172
|
+
end
|
173
|
+
|
174
|
+
def with_entities(*terms)
|
175
|
+
entities(*terms)
|
176
|
+
end
|
177
|
+
|
178
|
+
def entity(*terms)
|
179
|
+
entities(*terms)
|
180
|
+
end
|
181
|
+
|
182
|
+
def entities(*terms)
|
183
|
+
join_with_operator(terms, connector: ' ', operator: 'entity')
|
184
|
+
end
|
185
|
+
|
186
|
+
def with_one_of_entity(*terms)
|
187
|
+
with_one_of_entities(*terms)
|
188
|
+
end
|
189
|
+
|
190
|
+
def with_one_of_entities(*terms)
|
191
|
+
join_with_operator(terms, connector: ' OR ', operator: 'entity')
|
192
|
+
end
|
193
|
+
|
194
|
+
def without_entity(*terms)
|
195
|
+
not_with_entities(*terms)
|
196
|
+
end
|
197
|
+
|
198
|
+
def without_entities(*terms)
|
199
|
+
not_with_entities(*terms)
|
200
|
+
end
|
201
|
+
|
202
|
+
def not_with_entity(*terms)
|
203
|
+
not_with_entities(*terms)
|
204
|
+
end
|
205
|
+
|
206
|
+
def not_with_entities(*terms)
|
207
|
+
join_with_operator(terms, connector: ' ', operator: '-entity')
|
208
|
+
end
|
209
|
+
|
210
|
+
def with_conversation_id(*terms)
|
211
|
+
conversation_ids(*terms)
|
212
|
+
end
|
213
|
+
|
214
|
+
def with_conversation_ids(*terms)
|
215
|
+
conversation_ids(*terms)
|
216
|
+
end
|
217
|
+
|
218
|
+
def conversation_id(*terms)
|
219
|
+
conversation_ids(*terms)
|
220
|
+
end
|
221
|
+
|
222
|
+
def conversation_ids(*terms)
|
223
|
+
join_with_operator(terms, connector: ' ', operator: 'conversation_id')
|
224
|
+
end
|
225
|
+
|
226
|
+
def with_one_of_conversation_id(*terms)
|
227
|
+
with_one_of_conversation_ids(*terms)
|
228
|
+
end
|
229
|
+
|
230
|
+
def with_one_of_conversation_ids(*terms)
|
231
|
+
join_with_operator(terms, connector: ' OR ', operator: 'conversation_id')
|
232
|
+
end
|
233
|
+
|
234
|
+
def without_conversation_id(*terms)
|
235
|
+
without_conversation_ids(*terms)
|
236
|
+
end
|
237
|
+
|
238
|
+
def without_conversation_ids(*terms)
|
239
|
+
join_with_operator(terms, connector: ' ', operator: '-conversation_id')
|
240
|
+
end
|
241
|
+
|
242
|
+
def location(*terms)
|
243
|
+
from_places(*terms)
|
244
|
+
end
|
245
|
+
|
246
|
+
def locations(*terms)
|
247
|
+
from_places(*terms)
|
248
|
+
end
|
249
|
+
|
250
|
+
def place(*terms)
|
251
|
+
from_places(*terms)
|
252
|
+
end
|
253
|
+
|
254
|
+
def places(*terms)
|
255
|
+
from_places(*terms)
|
256
|
+
end
|
257
|
+
|
258
|
+
def from_location(*terms)
|
259
|
+
from_places(*terms)
|
260
|
+
end
|
261
|
+
|
262
|
+
def from_locations(*terms)
|
263
|
+
from_places(*terms)
|
264
|
+
end
|
265
|
+
|
266
|
+
def from_place(*terms)
|
267
|
+
from_places(*terms)
|
268
|
+
end
|
269
|
+
|
270
|
+
def from_places(*terms)
|
271
|
+
join_with_operator(terms, connector: ' ', operator: 'place')
|
272
|
+
end
|
273
|
+
|
274
|
+
def from_one_of_location(*terms)
|
275
|
+
from_one_of_places(*terms)
|
276
|
+
end
|
277
|
+
|
278
|
+
def from_one_of_locations(*terms)
|
279
|
+
from_one_of_places(*terms)
|
280
|
+
end
|
281
|
+
|
282
|
+
def from_one_of_place(*terms)
|
283
|
+
from_one_of_places(*terms)
|
284
|
+
end
|
285
|
+
|
286
|
+
def from_one_of_places(*terms)
|
287
|
+
join_with_operator(terms, connector: ' OR ', operator: 'place')
|
288
|
+
end
|
289
|
+
|
290
|
+
def not_from_location(*terms)
|
291
|
+
not_from_places(*terms)
|
292
|
+
end
|
293
|
+
|
294
|
+
def not_from_place(*terms)
|
295
|
+
not_from_places(*terms)
|
296
|
+
end
|
297
|
+
|
298
|
+
def not_from_locations(*terms)
|
299
|
+
not_from_places(*terms)
|
300
|
+
end
|
301
|
+
|
302
|
+
def not_from_places(*terms)
|
303
|
+
join_with_operator(terms, connector: ' ', operator: '-place')
|
304
|
+
end
|
305
|
+
|
306
|
+
def country(*terms)
|
307
|
+
from_countries(*terms)
|
308
|
+
end
|
309
|
+
|
310
|
+
def countries(*terms)
|
311
|
+
from_countries(*terms)
|
312
|
+
end
|
313
|
+
|
314
|
+
def from_country(*terms)
|
315
|
+
from_countries(*terms)
|
316
|
+
end
|
317
|
+
|
318
|
+
def from_countries(*terms)
|
319
|
+
join_with_operator(terms, connector: ' ', operator: 'place_country')
|
320
|
+
end
|
321
|
+
|
322
|
+
def from_one_of_country(*terms)
|
323
|
+
from_one_of_countries(*terms)
|
324
|
+
end
|
325
|
+
|
326
|
+
def from_one_of_countries(*terms)
|
327
|
+
join_with_operator(terms, connector: ' OR ', operator: 'place_country')
|
328
|
+
end
|
329
|
+
|
330
|
+
def not_from_country(*terms)
|
331
|
+
not_from_countries(*terms)
|
332
|
+
end
|
333
|
+
|
334
|
+
def not_from_countries(*terms)
|
335
|
+
join_with_operator(terms, connector: ' ', operator: '-place_country')
|
336
|
+
end
|
337
|
+
|
338
|
+
def lang(*terms)
|
339
|
+
language(*terms)
|
340
|
+
end
|
341
|
+
|
342
|
+
def language(*terms)
|
343
|
+
join_with_operator(terms, connector: ' ', operator: 'lang')
|
344
|
+
end
|
345
|
+
|
346
|
+
def not_lang(*terms)
|
347
|
+
not_language(*terms)
|
348
|
+
end
|
349
|
+
|
350
|
+
def not_language(*terms)
|
351
|
+
join_with_operator(terms, connector: ' ', operator: '-lang')
|
352
|
+
end
|
353
|
+
|
354
|
+
def join(terms, connector:, **opts)
|
355
|
+
unless terms.empty?
|
356
|
+
terms = terms.collect do |term|
|
357
|
+
term = term.to_s
|
358
|
+
term = term.strip
|
359
|
+
if term.split.length > 1
|
360
|
+
"\"#{term}\""
|
361
|
+
else
|
362
|
+
term
|
363
|
+
end
|
364
|
+
end
|
365
|
+
terms = terms.join(connector)
|
366
|
+
append_to_current_query(terms)
|
367
|
+
terms
|
368
|
+
end
|
369
|
+
end
|
370
|
+
|
371
|
+
def join_with_operator(terms, connector:, operator:, **opts)
|
372
|
+
unless terms.empty?
|
373
|
+
terms = terms.collect do |term|
|
374
|
+
term = term.to_s
|
375
|
+
term = term.strip
|
376
|
+
if term.split.length > 1
|
377
|
+
"\"#{term}\""
|
378
|
+
else
|
379
|
+
term
|
380
|
+
end
|
381
|
+
end
|
382
|
+
terms = terms.collect { |term| "#{operator}:#{term}" }
|
383
|
+
terms = terms.join(connector)
|
384
|
+
append_to_current_query(terms)
|
385
|
+
terms
|
386
|
+
end
|
387
|
+
end
|
388
|
+
|
389
|
+
def join_with_negated_operator(terms, **opts)
|
390
|
+
unless terms.empty?
|
391
|
+
terms = terms.collect do |term|
|
392
|
+
term = term.to_s
|
393
|
+
term = term.strip
|
394
|
+
if term.split.length > 1
|
395
|
+
"\"#{term}\""
|
396
|
+
else
|
397
|
+
term
|
398
|
+
end
|
399
|
+
end
|
400
|
+
terms = terms.collect { |term| "-#{term}" }
|
401
|
+
terms = terms.join(' ')
|
402
|
+
append_to_current_query(terms)
|
403
|
+
terms
|
404
|
+
end
|
405
|
+
end
|
406
|
+
|
407
|
+
def append_to_current_query(term)
|
408
|
+
if @current_query
|
409
|
+
@current_query += " #{term}"
|
410
|
+
else
|
411
|
+
@current_query = term
|
412
|
+
end
|
413
|
+
end
|
414
|
+
|
415
|
+
def group(&block)
|
416
|
+
Conjunctions.alias_method :original_join, :join
|
417
|
+
Conjunctions.alias_method :original_join_with_operator, :join_with_operator
|
418
|
+
Conjunctions.alias_method :original_join_with_negated_operator, :join_with_negated_operator
|
419
|
+
|
420
|
+
def join(terms, connector:, **opts)
|
421
|
+
unless terms.empty?
|
422
|
+
terms = terms.collect do |term|
|
423
|
+
term = term.to_s
|
424
|
+
term = term.strip
|
425
|
+
if term.split.length > 1
|
426
|
+
"\"#{term}\""
|
427
|
+
else
|
428
|
+
term
|
429
|
+
end
|
430
|
+
end
|
431
|
+
terms = terms.join(connector)
|
432
|
+
group_terms(terms)
|
433
|
+
end
|
434
|
+
end
|
435
|
+
|
436
|
+
def join_with_operator(terms, connector:, operator:, **opts)
|
437
|
+
unless terms.empty?
|
438
|
+
terms = terms.collect do |term|
|
439
|
+
term = term.to_s
|
440
|
+
term = term.strip
|
441
|
+
if term.split.length > 1
|
442
|
+
"\"#{term}\""
|
443
|
+
else
|
444
|
+
term
|
445
|
+
end
|
446
|
+
end
|
447
|
+
terms = terms.collect { |term| "#{operator}:#{term}" }
|
448
|
+
terms = terms.join(connector)
|
449
|
+
group_terms(terms)
|
450
|
+
end
|
451
|
+
end
|
452
|
+
|
453
|
+
def join_with_negated_operator(terms, **opts)
|
454
|
+
unless terms.empty?
|
455
|
+
terms = terms.collect do |term|
|
456
|
+
term = term.to_s
|
457
|
+
term = term.strip
|
458
|
+
if term.split.length > 1
|
459
|
+
"\"#{term}\""
|
460
|
+
else
|
461
|
+
term
|
462
|
+
end
|
463
|
+
end
|
464
|
+
terms = terms.collect { |term| "-#{term}" }
|
465
|
+
terms = terms.join(' ')
|
466
|
+
group_terms(terms)
|
467
|
+
end
|
468
|
+
end
|
469
|
+
|
470
|
+
def group_terms(term)
|
471
|
+
if @grouped_terms
|
472
|
+
@grouped_terms << term
|
473
|
+
else
|
474
|
+
@grouped_terms = []
|
475
|
+
@grouped_terms << term
|
476
|
+
end
|
477
|
+
end
|
478
|
+
|
479
|
+
def combine_terms
|
480
|
+
@combined_grouped_terms = @grouped_terms.join(' ')
|
481
|
+
@combined_grouped_terms = "(#{@combined_grouped_terms})"
|
482
|
+
append_to_current_query(@combined_grouped_terms)
|
483
|
+
end
|
484
|
+
|
485
|
+
instance_eval(&block)
|
486
|
+
combine_terms
|
487
|
+
|
488
|
+
Conjunctions.alias_method :join, :original_join
|
489
|
+
Conjunctions.alias_method :join_with_operator, :original_join_with_operator
|
490
|
+
Conjunctions.alias_method :join_with_negated_operator, :original_join_with_negated_operator
|
491
|
+
|
492
|
+
@combined_grouped_terms
|
493
|
+
end
|
494
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'conjunctions';
|
4
|
+
|
5
|
+
module Tweetkit
|
6
|
+
class Search
|
7
|
+
include Conjunctions
|
8
|
+
|
9
|
+
attr_accessor :current_query
|
10
|
+
|
11
|
+
def initialize(term)
|
12
|
+
@current_query = term
|
13
|
+
end
|
14
|
+
|
15
|
+
def opts
|
16
|
+
@opts ||= {}
|
17
|
+
end
|
18
|
+
|
19
|
+
def evaluate(&block)
|
20
|
+
instance_eval(&block)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -1,10 +1,10 @@
|
|
1
|
-
|
1
|
+
require_relative 'search/search'
|
2
2
|
|
3
3
|
module Tweetkit
|
4
4
|
class Client
|
5
5
|
module Tweets
|
6
6
|
def tweet(id, **options)
|
7
|
-
get "tweets/#{id}", options
|
7
|
+
get "tweets/#{id}", **options
|
8
8
|
end
|
9
9
|
|
10
10
|
def tweets(ids, **options)
|
@@ -13,13 +13,21 @@ module Tweetkit
|
|
13
13
|
else
|
14
14
|
ids = ids.delete(' ')
|
15
15
|
end
|
16
|
-
get 'tweets', options.merge!({ ids: ids })
|
16
|
+
get 'tweets', **options.merge!({ ids: ids })
|
17
17
|
end
|
18
18
|
|
19
19
|
def search(query = '', type: :tweet, **options, &block)
|
20
20
|
search = Search.new(query)
|
21
|
-
search.
|
22
|
-
get 'tweets/search/recent', options.merge!({ query: search.
|
21
|
+
search.evaluate(&block) if block_given?
|
22
|
+
get 'tweets/search/recent', **options.merge!({ query: search.current_query })
|
23
|
+
end
|
24
|
+
|
25
|
+
def post_tweet(**options)
|
26
|
+
post "tweets", **options
|
27
|
+
end
|
28
|
+
|
29
|
+
def delete_tweet(id)
|
30
|
+
delete "tweets/#{id}"
|
23
31
|
end
|
24
32
|
end
|
25
33
|
end
|
data/lib/tweetkit/client.rb
CHANGED