twitter 5.3.1 → 5.4.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.
- data.tar.gz.sig +3 -2
- data/CHANGELOG.md +4 -0
- data/Rakefile +1 -1
- data/lib/twitter/cursor.rb +5 -27
- data/lib/twitter/enumerable.rb +10 -0
- data/lib/twitter/rest/api/favorites.rb +2 -2
- data/lib/twitter/rest/api/search.rb +8 -1
- data/lib/twitter/search_results.rb +31 -46
- data/lib/twitter/version.rb +2 -2
- data/spec/fixtures/search.json +1 -1
- data/spec/fixtures/search2.json +1 -0
- data/spec/twitter/cursor_spec.rb +0 -38
- data/spec/twitter/rest/api/search_spec.rb +7 -13
- data/spec/twitter/search_results_spec.rb +10 -106
- data/twitter.gemspec +1 -1
- metadata +6 -4
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
@@ -1,2 +1,3 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
��7����OV��!��}9�JNM
|
2
|
+
��D�u;��^�&
|
3
|
+
��>h[ܤ+?@.���֓9�.kG��
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
5.4.0
|
2
|
+
-----
|
3
|
+
* [Fix enumerable search interface](https://github.com/sferik/twitter/commit/e14cc3391ebe8229184e9e83806c870df3baa24c)
|
4
|
+
|
1
5
|
5.3.1
|
2
6
|
-----
|
3
7
|
* [Add `Twitter::Utils` module](https://github.com/sferik/twitter/commit/a1f47fbf19b859c8e680a0a92eff5e225a015090) ([@charliesome](https://twitter.com/charliesome))
|
data/Rakefile
CHANGED
data/lib/twitter/cursor.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
+
require 'twitter/enumerable'
|
2
|
+
|
1
3
|
module Twitter
|
2
4
|
class Cursor
|
3
|
-
include Enumerable
|
5
|
+
include Twitter::Enumerable
|
4
6
|
attr_reader :attrs
|
5
7
|
alias_method :to_h, :attrs
|
6
8
|
alias_method :to_hash, :attrs
|
@@ -32,7 +34,7 @@ module Twitter
|
|
32
34
|
# @param path [String]
|
33
35
|
# @param options [Hash]
|
34
36
|
# @return [Twitter::Cursor]
|
35
|
-
def initialize(attrs, key, klass, client, request_method, path, options) # rubocop:disable ParameterLists
|
37
|
+
def initialize(attrs, key, klass, client, request_method, path, options = {}) # rubocop:disable ParameterLists
|
36
38
|
@key = key.to_sym
|
37
39
|
@klass = klass
|
38
40
|
@client = client
|
@@ -43,42 +45,18 @@ module Twitter
|
|
43
45
|
set_attrs(attrs)
|
44
46
|
end
|
45
47
|
|
46
|
-
|
47
|
-
def each(start = 0, &block)
|
48
|
-
return to_enum(:each) unless block_given?
|
49
|
-
Array(@collection[start..-1]).each do |element|
|
50
|
-
yield element
|
51
|
-
end
|
52
|
-
unless last?
|
53
|
-
start = [@collection.size, start].max
|
54
|
-
fetch_next_page
|
55
|
-
each(start, &block)
|
56
|
-
end
|
57
|
-
self
|
58
|
-
end
|
48
|
+
private
|
59
49
|
|
60
50
|
def next_cursor
|
61
51
|
@attrs[:next_cursor] || -1
|
62
52
|
end
|
63
53
|
alias_method :next, :next_cursor
|
64
54
|
|
65
|
-
def previous_cursor
|
66
|
-
@attrs[:previous_cursor]
|
67
|
-
end
|
68
|
-
alias_method :previous, :previous_cursor
|
69
|
-
|
70
|
-
# @return [Boolean]
|
71
|
-
def first?
|
72
|
-
previous_cursor.zero?
|
73
|
-
end
|
74
|
-
|
75
55
|
# @return [Boolean]
|
76
56
|
def last?
|
77
57
|
next_cursor.zero?
|
78
58
|
end
|
79
59
|
|
80
|
-
private
|
81
|
-
|
82
60
|
def fetch_next_page
|
83
61
|
response = @client.send(@request_method, @path, @options.merge(:cursor => next_cursor))
|
84
62
|
set_attrs(response[:body])
|
data/lib/twitter/enumerable.rb
CHANGED
@@ -8,7 +8,17 @@ module Twitter
|
|
8
8
|
Array(@collection[start..-1]).each do |element|
|
9
9
|
yield element
|
10
10
|
end
|
11
|
+
unless last?
|
12
|
+
start = [@collection.size, start].max
|
13
|
+
fetch_next_page
|
14
|
+
each(start, &block)
|
15
|
+
end
|
11
16
|
self
|
12
17
|
end
|
18
|
+
|
19
|
+
# @return [Boolean]
|
20
|
+
def last?
|
21
|
+
true
|
22
|
+
end
|
13
23
|
end
|
14
24
|
end
|
@@ -17,13 +17,13 @@ module Twitter
|
|
17
17
|
# @authentication Requires user context
|
18
18
|
# @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
|
19
19
|
# @return [Array<Twitter::Tweet>] favorite Tweets.
|
20
|
-
# @overload favorites(options={})
|
20
|
+
# @overload favorites(options = {})
|
21
21
|
# Returns the 20 most recent favorite Tweets for the authenticating user
|
22
22
|
#
|
23
23
|
# @param options [Hash] A customizable set of options.
|
24
24
|
# @option options [Integer] :count Specifies the number of records to retrieve. Must be less than or equal to 100.
|
25
25
|
# @option options [Integer] :since_id Returns results with an ID greater than (that is, more recent than) the specified ID.
|
26
|
-
# @overload favorites(user, options={})
|
26
|
+
# @overload favorites(user, options = {})
|
27
27
|
# Returns the 20 most recent favorite Tweets for the specified user
|
28
28
|
#
|
29
29
|
# @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, URI, or object.
|
@@ -28,7 +28,14 @@ module Twitter
|
|
28
28
|
# @option options [Boolean, String, Integer] :include_entities The tweet entities node will be disincluded when set to false.
|
29
29
|
# @return [Twitter::SearchResults] Return tweets that match a specified query with search metadata
|
30
30
|
def search(q, options = {})
|
31
|
-
|
31
|
+
search_results_from_response(:get, '/1.1/search/tweets.json', options.merge(:q => q))
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def search_results_from_response(request_method, path, options = {}) # rubocop:disable ParameterLists
|
37
|
+
response = send(request_method.to_sym, path, options)
|
38
|
+
Twitter::SearchResults.from_response(response, self, request_method, path, options)
|
32
39
|
end
|
33
40
|
end
|
34
41
|
end
|
@@ -12,53 +12,36 @@ module Twitter
|
|
12
12
|
# Construct a new SearchResults object from a response hash
|
13
13
|
#
|
14
14
|
# @param response [Hash]
|
15
|
-
# @
|
16
|
-
|
17
|
-
|
15
|
+
# @param client [Twitter::REST::Client]
|
16
|
+
# @param path [String]
|
17
|
+
# @return [Twitter::SearchResults]
|
18
|
+
def from_response(response, client, request_method, path, options) # rubocop:disable ParameterLists
|
19
|
+
new(response[:body], client, request_method, path, options)
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
21
23
|
# Initializes a new SearchResults object
|
22
24
|
#
|
23
25
|
# @param attrs [Hash]
|
26
|
+
# @param client [Twitter::REST::Client]
|
27
|
+
# @param request_method [String, Symbol]
|
28
|
+
# @param path [String]
|
29
|
+
# @param options [Hash]
|
24
30
|
# @return [Twitter::SearchResults]
|
25
|
-
def initialize(attrs = {})
|
26
|
-
@
|
27
|
-
@
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
# @return [Float]
|
33
|
-
def completed_in
|
34
|
-
@attrs[:search_metadata][:completed_in] if @attrs[:search_metadata]
|
35
|
-
end
|
36
|
-
|
37
|
-
# @return [Integer]
|
38
|
-
def max_id
|
39
|
-
@attrs[:search_metadata][:max_id] if @attrs[:search_metadata]
|
40
|
-
end
|
41
|
-
|
42
|
-
# @return [Integer]
|
43
|
-
def page
|
44
|
-
@attrs[:search_metadata][:page] if @attrs[:search_metadata]
|
45
|
-
end
|
46
|
-
|
47
|
-
# @return [String]
|
48
|
-
def query
|
49
|
-
@attrs[:search_metadata][:query] if @attrs[:search_metadata]
|
31
|
+
def initialize(attrs, client, request_method, path, options = {}) # rubocop:disable ParameterLists
|
32
|
+
@client = client
|
33
|
+
@request_method = request_method.to_sym
|
34
|
+
@path = path
|
35
|
+
@options = options
|
36
|
+
@collection = []
|
37
|
+
set_attrs(attrs)
|
50
38
|
end
|
51
39
|
|
52
|
-
|
53
|
-
def results_per_page
|
54
|
-
@attrs[:search_metadata][:count] if @attrs[:search_metadata]
|
55
|
-
end
|
56
|
-
alias_method :rpp, :results_per_page
|
57
|
-
alias_method :count, :results_per_page
|
40
|
+
private
|
58
41
|
|
59
|
-
# @return [
|
60
|
-
def
|
61
|
-
|
42
|
+
# @return [Boolean]
|
43
|
+
def last?
|
44
|
+
!next_results?
|
62
45
|
end
|
63
46
|
|
64
47
|
# @return [Boolean]
|
@@ -66,6 +49,7 @@ module Twitter
|
|
66
49
|
!!(@attrs[:search_metadata] && @attrs[:search_metadata][:next_results])
|
67
50
|
end
|
68
51
|
alias_method :next_page?, :next_results?
|
52
|
+
alias_method :next?, :next_results?
|
69
53
|
|
70
54
|
# Returns a Hash of query parameters for the next result in the search
|
71
55
|
#
|
@@ -78,18 +62,19 @@ module Twitter
|
|
78
62
|
end
|
79
63
|
end
|
80
64
|
alias_method :next_page, :next_results
|
65
|
+
alias_method :next, :next_results
|
81
66
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
# @return [Hash] The parameters needed to refresh the page.
|
86
|
-
def refresh_results
|
87
|
-
query_string = strip_first_character(@attrs[:search_metadata][:refresh_url])
|
88
|
-
query_string_to_hash(query_string)
|
67
|
+
def fetch_next_page
|
68
|
+
response = @client.send(@request_method, @path, next_page)
|
69
|
+
set_attrs(response[:body])
|
89
70
|
end
|
90
|
-
alias_method :refresh_page, :refresh_results
|
91
71
|
|
92
|
-
|
72
|
+
def set_attrs(attrs)
|
73
|
+
@attrs = attrs
|
74
|
+
Array(@attrs[:statuses]).map do |tweet|
|
75
|
+
@collection << Tweet.new(tweet)
|
76
|
+
end
|
77
|
+
end
|
93
78
|
|
94
79
|
# Returns the string with the first character removed
|
95
80
|
#
|
data/lib/twitter/version.rb
CHANGED
data/spec/fixtures/search.json
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"statuses":[{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Mon Sep 17 22:41:52 +0000 2012","id":247827742178021376,"id_str":"247827742178021376","text":"Bubble Mailer #freebandnames","source":"\u003ca href=\"http:\/\/tapbots.com\" rel=\"nofollow\"\u003eTweetbot for Mac\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":671293,"id_str":"671293","name":"Richard Allen","screen_name":"richrad","location":"Kansas City","url":"http:\/\/richardallen.me","description":"Give me a break, Jeffery.","protected":false,"followers_count":174,"friends_count":273,"listed_count":2,"created_at":"Sat Jan 20 16:02:45 +0000 2007","favourites_count":383,"utc_offset":-21600,"time_zone":"Central Time (US & Canada)","geo_enabled":false,"verified":false,"statuses_count":1370,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"0099B9","profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme4\/bg.gif","profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme4\/bg.gif","profile_background_tile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1399177739\/notlookingup_normal.jpeg","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1399177739\/notlookingup_normal.jpeg","profile_link_color":"0099B9","profile_sidebar_border_color":"5ED4DC","profile_sidebar_fill_color":"95E8EC","profile_text_color":"3C3940","profile_use_background_image":true,"show_all_inline_media":true,"default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"entities":{"hashtags":[{"text":"freebandnames","indices":[14,28]}],"urls":[],"user_mentions":[]},"favorited":false,"retweeted":false}],"search_metadata":{"completed_in":0.029,"max_id":250126199840518145,"max_id_str":"250126199840518145","next_page":"?page=2&max_id=250126199840518145&q=%23freebandnames&rpp=4&include_entities=1&result_type=mixed","page":1,"query":"%23freebandnames","refresh_url":"?since_id=250126199840518145&q=%23freebandnames&result_type=mixed&include_entities=1","count":4,"since_id":24012619984051000,"since_id_str":"24012619984051000"}}
|
1
|
+
{"statuses":[{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Fri Dec 20 16:52:25 +0000 2013","id":414075829182676992,"id_str":"414075829182676992","text":"@Just_Reboot #FreeBandNames mono surround","source":"\u003ca href=\"http:\/\/www.myplume.com\/\" rel=\"nofollow\"\u003ePlume\u00a0for\u00a0Android\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":414069174856843264,"in_reply_to_status_id_str":"414069174856843264","in_reply_to_user_id":29296581,"in_reply_to_user_id_str":"29296581","in_reply_to_screen_name":"Just_Reboot","user":{"id":546527520,"id_str":"546527520","name":"Phil Empanada","screen_name":"ItsFuckinOhSo","location":"By cacti and sand","description":"Insert cheesy warnings about this account","url":null,"entities":{"description":{"urls":[]}},"protected":false,"followers_count":257,"friends_count":347,"listed_count":10,"created_at":"Fri Apr 06 02:15:16 +0000 2012","favourites_count":345,"utc_offset":-25200,"time_zone":"Arizona","geo_enabled":false,"verified":false,"statuses_count":21765,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/414512901680930816\/AcmN-ByT_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/414512901680930816\/AcmN-ByT_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/546527520\/1371244104","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":true,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"FreeBandNames","indices":[13,27]}],"symbols":[],"urls":[],"user_mentions":[{"screen_name":"Just_Reboot","name":"Reboot","id":29296581,"id_str":"29296581","indices":[0,12]}]},"favorited":false,"retweeted":false,"lang":"en"},{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Fri Dec 20 16:43:32 +0000 2013","id":414073595372265472,"id_str":"414073595372265472","text":"RT @Just_Reboot: The Dick Tonsils #FreeBandNames\u00a0","source":"\u003ca href=\"http:\/\/twitter.com\/download\/android\" rel=\"nofollow\"\u003eTwitter for Android\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":109670150,"id_str":"109670150","name":"Derek Rodriguez","screen_name":"drod2169","location":"Tampa, Florida","description":"Web Developer, College Student, Workout Addict, Taco Fiend. #FBGT","url":null,"entities":{"description":{"urls":[]}},"protected":false,"followers_count":3119,"friends_count":714,"listed_count":142,"created_at":"Fri Jan 29 21:29:16 +0000 2010","favourites_count":3728,"utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","geo_enabled":false,"verified":false,"statuses_count":46991,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/3347464379\/1046c92ab1834f1a3c1692ea585a1d69_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/3347464379\/1046c92ab1834f1a3c1692ea585a1d69_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/109670150\/1368729387","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":true,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweeted_status":{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Fri Dec 20 16:34:40 +0000 2013","id":414071361066532864,"id_str":"414071361066532864","text":"The Dick Tonsils #FreeBandNames\u00a0","source":"\u003ca href=\"http:\/\/www.myplume.com\/\" rel=\"nofollow\"\u003ePlume\u00a0for\u00a0Android\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":29296581,"id_str":"29296581","name":"Reboot","screen_name":"Just_Reboot","location":"NC","description":"G+ http:\/\/t.co\/MyXmhCAtnD\r\n#TeamKang PR, Attempted Writer, IT Tech, Social Media Berserker and Entertainer, Adjectives, Assertions, Disclaimers","url":null,"entities":{"description":{"urls":[{"url":"http:\/\/t.co\/MyXmhCAtnD","expanded_url":"http:\/\/goo.gl\/giVTc","display_url":"goo.gl\/giVTc","indices":[3,25]}]}},"protected":false,"followers_count":2244,"friends_count":435,"listed_count":60,"created_at":"Mon Apr 06 21:21:27 +0000 2009","favourites_count":79,"utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","geo_enabled":false,"verified":false,"statuses_count":27703,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"131516","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/871578268\/5db26751bf732750f5ca1ed4f9f59309.png","profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/871578268\/5db26751bf732750f5ca1ed4f9f59309.png","profile_background_tile":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/378800000480531175\/93e8b5cb95a635ebb81302f5b6044a76_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/378800000480531175\/93e8b5cb95a635ebb81302f5b6044a76_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/29296581\/1368898490","profile_link_color":"009999","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"EFEFEF","profile_text_color":"333333","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":1,"favorite_count":1,"entities":{"hashtags":[{"text":"FreeBandNames","indices":[17,31]}],"symbols":[],"urls":[],"user_mentions":[]},"favorited":false,"retweeted":false,"lang":"en"},"retweet_count":1,"favorite_count":0,"entities":{"hashtags":[{"text":"FreeBandNames","indices":[34,48]}],"symbols":[],"urls":[],"user_mentions":[{"screen_name":"Just_Reboot","name":"Reboot","id":29296581,"id_str":"29296581","indices":[3,15]}]},"favorited":false,"retweeted":false,"lang":"en"},{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Fri Dec 20 16:34:40 +0000 2013","id":414071361066532864,"id_str":"414071361066532864","text":"The Dick Tonsils #FreeBandNames\u00a0","source":"\u003ca href=\"http:\/\/www.myplume.com\/\" rel=\"nofollow\"\u003ePlume\u00a0for\u00a0Android\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":29296581,"id_str":"29296581","name":"Reboot","screen_name":"Just_Reboot","location":"NC","description":"G+ http:\/\/t.co\/MyXmhCAtnD\r\n#TeamKang PR, Attempted Writer, IT Tech, Social Media Berserker and Entertainer, Adjectives, Assertions, Disclaimers","url":null,"entities":{"description":{"urls":[{"url":"http:\/\/t.co\/MyXmhCAtnD","expanded_url":"http:\/\/goo.gl\/giVTc","display_url":"goo.gl\/giVTc","indices":[3,25]}]}},"protected":false,"followers_count":2244,"friends_count":435,"listed_count":60,"created_at":"Mon Apr 06 21:21:27 +0000 2009","favourites_count":79,"utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","geo_enabled":false,"verified":false,"statuses_count":27703,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"131516","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/871578268\/5db26751bf732750f5ca1ed4f9f59309.png","profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/871578268\/5db26751bf732750f5ca1ed4f9f59309.png","profile_background_tile":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/378800000480531175\/93e8b5cb95a635ebb81302f5b6044a76_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/378800000480531175\/93e8b5cb95a635ebb81302f5b6044a76_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/29296581\/1368898490","profile_link_color":"009999","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"EFEFEF","profile_text_color":"333333","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":1,"favorite_count":1,"entities":{"hashtags":[{"text":"FreeBandNames","indices":[17,31]}],"symbols":[],"urls":[],"user_mentions":[]},"favorited":false,"retweeted":false,"lang":"en"}],"search_metadata":{"completed_in":0.012,"max_id":414075829182676992,"max_id_str":"414075829182676992","next_results":"?max_id=414071361066532863&q=%23freebandnames&count=3&include_entities=1","query":"%23freebandnames","refresh_url":"?since_id=414075829182676992&q=%23freebandnames&include_entities=1","count":3,"since_id":0,"since_id_str":"0"}}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"statuses":[{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Fri Dec 20 16:24:22 +0000 2013","id":414068770484019200,"id_str":"414068770484019200","text":"The Thumb Dumpsters #FreeBandNames","source":"\u003ca href=\"http:\/\/www.myplume.com\/\" rel=\"nofollow\"\u003ePlume\u00a0for\u00a0Android\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":29296581,"id_str":"29296581","name":"Reboot","screen_name":"Just_Reboot","location":"NC","description":"G+ http:\/\/t.co\/MyXmhCAtnD\r\n#TeamKang PR, Attempted Writer, IT Tech, Social Media Berserker and Entertainer, Adjectives, Assertions, Disclaimers","url":null,"entities":{"description":{"urls":[{"url":"http:\/\/t.co\/MyXmhCAtnD","expanded_url":"http:\/\/goo.gl\/giVTc","display_url":"goo.gl\/giVTc","indices":[3,25]}]}},"protected":false,"followers_count":2244,"friends_count":435,"listed_count":60,"created_at":"Mon Apr 06 21:21:27 +0000 2009","favourites_count":79,"utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","geo_enabled":false,"verified":false,"statuses_count":27703,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"131516","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/871578268\/5db26751bf732750f5ca1ed4f9f59309.png","profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/871578268\/5db26751bf732750f5ca1ed4f9f59309.png","profile_background_tile":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/378800000480531175\/93e8b5cb95a635ebb81302f5b6044a76_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/378800000480531175\/93e8b5cb95a635ebb81302f5b6044a76_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/29296581\/1368898490","profile_link_color":"009999","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"EFEFEF","profile_text_color":"333333","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"FreeBandNames","indices":[20,34]}],"symbols":[],"urls":[],"user_mentions":[]},"favorited":false,"retweeted":false,"lang":"en"},{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Fri Dec 20 05:23:19 +0000 2013","id":413902412236083201,"id_str":"413902412236083201","text":"The Shit Smelters #freebandnames","source":"web","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":41614761,"id_str":"41614761","name":"Grizzlam","screen_name":"mattyp90","location":"","description":"Chicago via Nashville via Memphis","url":null,"entities":{"description":{"urls":[]}},"protected":false,"followers_count":585,"friends_count":745,"listed_count":8,"created_at":"Thu May 21 16:05:09 +0000 2009","favourites_count":9873,"utc_offset":-21600,"time_zone":"Central Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":13716,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"1A1B1F","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme9\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme9\/bg.gif","profile_background_tile":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/378800000726393028\/b17facdd394b0992dad251e3cc6b3f60_normal.png","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/378800000726393028\/b17facdd394b0992dad251e3cc6b3f60_normal.png","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/41614761\/1375052004","profile_link_color":"2FC2EF","profile_sidebar_border_color":"181A1E","profile_sidebar_fill_color":"252429","profile_text_color":"666666","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"freebandnames","indices":[18,32]}],"symbols":[],"urls":[],"user_mentions":[]},"favorited":false,"retweeted":false,"lang":"en"},{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Tue Dec 17 17:04:32 +0000 2013","id":412991713435975680,"id_str":"412991713435975680","text":"Big yellow moon #skyatnight #freebandnames","source":"\u003ca href=\"http:\/\/twitter.com\/download\/android\" rel=\"nofollow\"\u003eTwitter for Android\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":352463222,"id_str":"352463222","name":"Dean Weston","screen_name":"thehatsofdean","location":"Leicester","description":"Creative web designer & East Midlands hat wearer of the year 1993","url":"http:\/\/t.co\/l2Sn5tMK5W","entities":{"url":{"urls":[{"url":"http:\/\/t.co\/l2Sn5tMK5W","expanded_url":"http:\/\/www.deanweston.co.uk","display_url":"deanweston.co.uk","indices":[0,22]}]},"description":{"urls":[]}},"protected":false,"followers_count":37,"friends_count":68,"listed_count":0,"created_at":"Wed Aug 10 17:16:14 +0000 2011","favourites_count":5,"utc_offset":0,"time_zone":"London","geo_enabled":true,"verified":false,"statuses_count":914,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"EDE1B3","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/308734021\/twitter_bg.gif","profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/308734021\/twitter_bg.gif","profile_background_tile":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/2796373361\/83a960755f87b2557a44da86a11da9e4_normal.png","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/2796373361\/83a960755f87b2557a44da86a11da9e4_normal.png","profile_link_color":"993300","profile_sidebar_border_color":"ADA47E","profile_sidebar_fill_color":"D1C69D","profile_text_color":"333333","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"skyatnight","indices":[16,27]},{"text":"freebandnames","indices":[28,42]}],"symbols":[],"urls":[],"user_mentions":[]},"favorited":false,"retweeted":false,"lang":"en"}],"search_metadata":{"completed_in":0.072,"max_id":414068770484019200,"max_id_str":"414068770484019200","query":"%23freebandnames","refresh_url":"?since_id=414068770484019200&q=%23freebandnames&include_entities=1","count":15,"since_id":0,"since_id_str":"0"}}
|
data/spec/twitter/cursor_spec.rb
CHANGED
@@ -27,42 +27,4 @@ describe Twitter::Cursor do
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
describe '#first?' do
|
31
|
-
context 'when previous cursor equals zero' do
|
32
|
-
before do
|
33
|
-
@cursor = Twitter::Cursor.new({:previous_cursor => 0}, :ids, nil, Twitter::REST::Client.new, :get, '/1.1/followers/ids.json', {})
|
34
|
-
end
|
35
|
-
it 'returns true' do
|
36
|
-
expect(@cursor.first?).to be true
|
37
|
-
end
|
38
|
-
end
|
39
|
-
context 'when previous cursor does not equal zero' do
|
40
|
-
before do
|
41
|
-
@cursor = Twitter::Cursor.new({:previous_cursor => 1}, :ids, nil, Twitter::REST::Client.new, :get, '/1.1/followers/ids.json', {})
|
42
|
-
end
|
43
|
-
it 'returns true' do
|
44
|
-
expect(@cursor.first?).to be false
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
describe '#last?' do
|
50
|
-
context 'when next cursor equals zero' do
|
51
|
-
before do
|
52
|
-
@cursor = Twitter::Cursor.new({:next_cursor => 0}, :ids, nil, Twitter::REST::Client.new, :get, '/1.1/followers/ids.json', {})
|
53
|
-
end
|
54
|
-
it 'returns true' do
|
55
|
-
expect(@cursor.last?).to be true
|
56
|
-
end
|
57
|
-
end
|
58
|
-
context 'when next cursor does not equal zero' do
|
59
|
-
before do
|
60
|
-
@cursor = Twitter::Cursor.new({:next_cursor => 1}, :ids, nil, Twitter::REST::Client.new, :get, '/1.1/followers/ids.json', {})
|
61
|
-
end
|
62
|
-
it 'returns false' do
|
63
|
-
expect(@cursor.last?).to be false
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
30
|
end
|
@@ -8,30 +8,24 @@ describe Twitter::REST::API::Search do
|
|
8
8
|
|
9
9
|
describe '#search' do
|
10
10
|
before do
|
11
|
-
stub_get('/1.1/search/tweets.json').with(:query => {:q => '
|
11
|
+
stub_get('/1.1/search/tweets.json').with(:query => {:q => '#freebandnames'}).to_return(:body => fixture('search.json'), :headers => {:content_type => 'application/json; charset=utf-8'})
|
12
12
|
end
|
13
13
|
it 'requests the correct resource' do
|
14
|
-
@client.search('
|
15
|
-
expect(a_get('/1.1/search/tweets.json').with(:query => {:q => '
|
14
|
+
@client.search('#freebandnames')
|
15
|
+
expect(a_get('/1.1/search/tweets.json').with(:query => {:q => '#freebandnames'})).to have_been_made
|
16
16
|
end
|
17
17
|
it 'returns recent Tweets related to a query with images and videos embedded' do
|
18
|
-
search = @client.search('
|
18
|
+
search = @client.search('#freebandnames')
|
19
19
|
expect(search).to be_a Twitter::SearchResults
|
20
20
|
expect(search.first).to be_a Twitter::Tweet
|
21
|
-
expect(search.first.text).to eq('
|
21
|
+
expect(search.first.text).to eq('@Just_Reboot #FreeBandNames mono surround')
|
22
22
|
end
|
23
|
-
it 'returns the max_id value for a search result' do
|
24
|
-
search = @client.search('twitter')
|
25
|
-
expect(search.max_id).to eq(250_126_199_840_518_145)
|
26
|
-
end
|
27
|
-
|
28
23
|
context 'when search API responds a malformed result' do
|
29
24
|
before do
|
30
|
-
stub_get('/1.1/search/tweets.json').with(:query => {:q => '
|
25
|
+
stub_get('/1.1/search/tweets.json').with(:query => {:q => '#freebandnames'}).to_return(:body => fixture('search_malformed.json'), :headers => {:content_type => 'application/json; charset=utf-8'})
|
31
26
|
end
|
32
|
-
|
33
27
|
it 'returns an empty array' do
|
34
|
-
search = @client.search('
|
28
|
+
search = @client.search('#freebandnames')
|
35
29
|
expect(search.to_a).to be_an Array
|
36
30
|
expect(search.to_a).to be_empty
|
37
31
|
end
|
@@ -4,123 +4,27 @@ describe Twitter::SearchResults do
|
|
4
4
|
|
5
5
|
describe '#each' do
|
6
6
|
before do
|
7
|
-
@
|
7
|
+
@client = Twitter::REST::Client.new(:consumer_key => 'CK', :consumer_secret => 'CS', :access_token => 'AT', :access_token_secret => 'AS')
|
8
|
+
stub_get('/1.1/search/tweets.json').with(:query => {:q => '#freebandnames'}).to_return(:body => fixture('search.json'), :headers => {:content_type => 'application/json; charset=utf-8'})
|
9
|
+
stub_get('/1.1/search/tweets.json').with(:query => {:q => '#freebandnames', :count => '3', :include_entities => '1', :max_id => '414071361066532863'}).to_return(:body => fixture('search2.json'), :headers => {:content_type => 'application/json; charset=utf-8'})
|
10
|
+
end
|
11
|
+
it 'requests the correct resources' do
|
12
|
+
@client.search('#freebandnames').each {}
|
13
|
+
expect(a_get('/1.1/search/tweets.json').with(:query => {:q => '#freebandnames'})).to have_been_made
|
14
|
+
expect(a_get('/1.1/search/tweets.json').with(:query => {:q => '#freebandnames', :count => '3', :include_entities => '1', :max_id => '414071361066532863'})).to have_been_made
|
8
15
|
end
|
9
16
|
it 'iterates' do
|
10
17
|
count = 0
|
11
|
-
@
|
18
|
+
@client.search('#freebandnames').each { count += 1 }
|
12
19
|
expect(count).to eq(6)
|
13
20
|
end
|
14
21
|
context 'with start' do
|
15
22
|
it 'iterates' do
|
16
23
|
count = 0
|
17
|
-
@
|
24
|
+
@client.search('#freebandnames').each(5) { count += 1 }
|
18
25
|
expect(count).to eq(1)
|
19
26
|
end
|
20
27
|
end
|
21
28
|
end
|
22
29
|
|
23
|
-
describe '#completed_in' do
|
24
|
-
it 'returns a number of seconds' do
|
25
|
-
completed_in = Twitter::SearchResults.new(:search_metadata => {:completed_in => 0.029}).completed_in
|
26
|
-
expect(completed_in).to be_a Float
|
27
|
-
expect(completed_in).to eq(0.029)
|
28
|
-
end
|
29
|
-
it 'is nil when not set' do
|
30
|
-
completed_in = Twitter::SearchResults.new.completed_in
|
31
|
-
expect(completed_in).to be_nil
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
describe '#max_id' do
|
36
|
-
it 'returns an ID' do
|
37
|
-
max_id = Twitter::SearchResults.new(:search_metadata => {:max_id => 250_126_199_840_518_145}).max_id
|
38
|
-
expect(max_id).to be_an Integer
|
39
|
-
expect(max_id).to eq(250_126_199_840_518_145)
|
40
|
-
end
|
41
|
-
it 'is nil when not set' do
|
42
|
-
max_id = Twitter::SearchResults.new.max_id
|
43
|
-
expect(max_id).to be_nil
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
describe '#page' do
|
48
|
-
it 'returns page number' do
|
49
|
-
page = Twitter::SearchResults.new(:search_metadata => {:page => 1}).page
|
50
|
-
expect(page).to be_an Integer
|
51
|
-
expect(page).to eq(1)
|
52
|
-
end
|
53
|
-
it 'is nil when not set' do
|
54
|
-
page = Twitter::SearchResults.new.page
|
55
|
-
expect(page).to be_nil
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
describe '#query' do
|
60
|
-
it 'returns the query' do
|
61
|
-
query = Twitter::SearchResults.new(:search_metadata => {:query => '%23freebandnames'}).query
|
62
|
-
expect(query).to be_a String
|
63
|
-
expect(query).to eq('%23freebandnames')
|
64
|
-
end
|
65
|
-
it 'is nil when not set' do
|
66
|
-
query = Twitter::SearchResults.new.query
|
67
|
-
expect(query).to be_nil
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
describe '#results_per_page' do
|
72
|
-
it 'returns the number of results per page' do
|
73
|
-
results_per_page = Twitter::SearchResults.new(:search_metadata => {:count => 4}).results_per_page
|
74
|
-
expect(results_per_page).to be_an Integer
|
75
|
-
expect(results_per_page).to eq(4)
|
76
|
-
end
|
77
|
-
it 'is nil when not set' do
|
78
|
-
results_per_page = Twitter::SearchResults.new.results_per_page
|
79
|
-
expect(results_per_page).to be_nil
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
describe '#since_id' do
|
84
|
-
it 'returns an ID' do
|
85
|
-
since_id = Twitter::SearchResults.new(:search_metadata => {:since_id => 250_126_199_840_518_145}).since_id
|
86
|
-
expect(since_id).to be_an Integer
|
87
|
-
expect(since_id).to eq(250_126_199_840_518_145)
|
88
|
-
end
|
89
|
-
it 'is nil when not set' do
|
90
|
-
since_id = Twitter::SearchResults.new.since_id
|
91
|
-
expect(since_id).to be_nil
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
describe '#next_results?' do
|
96
|
-
it 'returns true when next_results is set' do
|
97
|
-
next_results = Twitter::SearchResults.new(:search_metadata => {:next_results => '?'}).next_results?
|
98
|
-
expect(next_results).to be true
|
99
|
-
end
|
100
|
-
it 'returns false when next_results is not set' do
|
101
|
-
next_results = Twitter::SearchResults.new(:search_metadata => {}).next_results?
|
102
|
-
expect(next_results).to be false
|
103
|
-
end
|
104
|
-
it 'returns false is search_metadata is not set' do
|
105
|
-
next_results = Twitter::SearchResults.new.next_results?
|
106
|
-
expect(next_results).to be false
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
describe '#next_results' do
|
111
|
-
it 'returns a hash of query parameters' do
|
112
|
-
search_results = Twitter::SearchResults.new(:search_metadata => {:next_results => '?max_id=249279667666817023&q=%23freebandnames&count=4&include_entities=1&result_type=mixed'})
|
113
|
-
expect(search_results.next_results).to be_a Hash
|
114
|
-
expect(search_results.next_results[:max_id]).to eq('249279667666817023')
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
describe '#refresh_results' do
|
119
|
-
it 'returns a hash of query parameters' do
|
120
|
-
search_results = Twitter::SearchResults.new(:search_metadata => {:refresh_url => '?since_id=249279667666817023&q=%23freebandnames&count=4&include_entities=1&result_type=recent'})
|
121
|
-
expect(search_results.refresh_results).to be_a Hash
|
122
|
-
expect(search_results.refresh_results[:since_id]).to eq('249279667666817023')
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
30
|
end
|
data/twitter.gemspec
CHANGED
@@ -5,7 +5,7 @@ require 'twitter/version'
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.add_dependency 'addressable', '~> 2.3'
|
7
7
|
spec.add_dependency 'buftok', '~> 0.2.0'
|
8
|
-
spec.add_dependency 'descendants_tracker', '~> 0.0.
|
8
|
+
spec.add_dependency 'descendants_tracker', '~> 0.0.3'
|
9
9
|
spec.add_dependency 'equalizer', '~> 0.0.9'
|
10
10
|
spec.add_dependency 'faraday', ['>= 0.8', '< 0.10']
|
11
11
|
spec.add_dependency 'http', '~> 0.5.0'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: twitter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -81,7 +81,7 @@ dependencies:
|
|
81
81
|
requirements:
|
82
82
|
- - ~>
|
83
83
|
- !ruby/object:Gem::Version
|
84
|
-
version: 0.0.
|
84
|
+
version: 0.0.3
|
85
85
|
type: :runtime
|
86
86
|
prerelease: false
|
87
87
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -89,7 +89,7 @@ dependencies:
|
|
89
89
|
requirements:
|
90
90
|
- - ~>
|
91
91
|
- !ruby/object:Gem::Version
|
92
|
-
version: 0.0.
|
92
|
+
version: 0.0.3
|
93
93
|
- !ruby/object:Gem::Dependency
|
94
94
|
name: equalizer
|
95
95
|
requirement: !ruby/object:Gem::Requirement
|
@@ -377,6 +377,7 @@ files:
|
|
377
377
|
- spec/fixtures/saved_search.json
|
378
378
|
- spec/fixtures/saved_searches.json
|
379
379
|
- spec/fixtures/search.json
|
380
|
+
- spec/fixtures/search2.json
|
380
381
|
- spec/fixtures/search_malformed.json
|
381
382
|
- spec/fixtures/settings.json
|
382
383
|
- spec/fixtures/sferik.json
|
@@ -468,7 +469,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
468
469
|
version: '0'
|
469
470
|
segments:
|
470
471
|
- 0
|
471
|
-
hash:
|
472
|
+
hash: 2007374580956818801
|
472
473
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
473
474
|
none: false
|
474
475
|
requirements:
|
@@ -528,6 +529,7 @@ test_files:
|
|
528
529
|
- spec/fixtures/saved_search.json
|
529
530
|
- spec/fixtures/saved_searches.json
|
530
531
|
- spec/fixtures/search.json
|
532
|
+
- spec/fixtures/search2.json
|
531
533
|
- spec/fixtures/search_malformed.json
|
532
534
|
- spec/fixtures/settings.json
|
533
535
|
- spec/fixtures/sferik.json
|
metadata.gz.sig
CHANGED
Binary file
|