ruby-stackoverflow 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.travis.yml +5 -0
- data/CHANGELOG.md +4 -0
- data/Gemfile +0 -5
- data/README.md +5 -6
- data/lib/generators/ruby_stackoverflow/ruby_stackoverflow_generator.rb +2 -6
- data/lib/ruby-stackoverflow.rb +2 -5
- data/lib/ruby-stackoverflow/client/badges_helper.rb +23 -26
- data/lib/ruby-stackoverflow/client/comments_helper.rb +5 -7
- data/lib/ruby-stackoverflow/client/parse_options.rb +2 -3
- data/lib/ruby-stackoverflow/client/question_helper.rb +1 -3
- data/lib/ruby-stackoverflow/client/resource/answer.rb +0 -1
- data/lib/ruby-stackoverflow/client/resource/badge.rb +0 -1
- data/lib/ruby-stackoverflow/client/resource/comment.rb +0 -2
- data/lib/ruby-stackoverflow/client/resource/notification.rb +0 -2
- data/lib/ruby-stackoverflow/client/resource/permission.rb +0 -2
- data/lib/ruby-stackoverflow/client/resource/post.rb +0 -1
- data/lib/ruby-stackoverflow/client/resource/question.rb +5 -7
- data/lib/ruby-stackoverflow/client/resource/suggested_edit.rb +0 -2
- data/lib/ruby-stackoverflow/client/resource/tag.rb +0 -13
- data/lib/ruby-stackoverflow/client/resource/user.rb +4 -4
- data/lib/ruby-stackoverflow/client/response_data.rb +3 -3
- data/lib/ruby-stackoverflow/client/user_helper.rb +9 -5
- data/lib/ruby-stackoverflow/configuration.rb +1 -1
- data/lib/ruby-stackoverflow/version.rb +1 -1
- data/ruby-stackoverflow.gemspec +2 -1
- data/spec/fixtures/vcr_cassettes/badges.yml +2 -2
- data/spec/fixtures/vcr_cassettes/badges_by_ids.yml +2 -2
- data/spec/fixtures/vcr_cassettes/badges_by_name.yml +2 -2
- data/spec/fixtures/vcr_cassettes/badges_by_recipients.yml +2 -2
- data/spec/fixtures/vcr_cassettes/badges_by_recipients_by_ids.yml +2 -2
- data/spec/fixtures/vcr_cassettes/badges_by_tags.yml +2 -2
- data/spec/fixtures/vcr_cassettes/comments.yml +2 -2
- data/spec/fixtures/vcr_cassettes/comments_by_ids.yml +2 -2
- data/spec/fixtures/vcr_cassettes/error.yml +2 -2
- data/spec/fixtures/vcr_cassettes/featured_questions.yml +2 -2
- data/spec/fixtures/vcr_cassettes/linked_questions.yml +2 -2
- data/spec/fixtures/vcr_cassettes/noanswered_questions.yml +2 -2
- data/spec/fixtures/vcr_cassettes/questions.yml +2 -2
- data/spec/fixtures/vcr_cassettes/questions_answers.yml +2 -2
- data/spec/fixtures/vcr_cassettes/questions_by_ids.yml +2 -2
- data/spec/fixtures/vcr_cassettes/questions_comments.yml +2 -2
- data/spec/fixtures/vcr_cassettes/related_questions.yml +2 -2
- data/spec/fixtures/vcr_cassettes/timeline_questions.yml +2 -2
- data/spec/fixtures/vcr_cassettes/unanswered_questions.yml +2 -2
- data/spec/fixtures/vcr_cassettes/user_timeline.yml +2 -2
- data/spec/fixtures/vcr_cassettes/user_top_answers_with_given_tags.yml +2 -2
- data/spec/fixtures/vcr_cassettes/user_top_questions_with_given_tags.yml +2 -2
- data/spec/fixtures/vcr_cassettes/user_top_tags_by_answers.yml +2 -2
- data/spec/fixtures/vcr_cassettes/user_top_tags_by_questions.yml +2 -2
- data/spec/fixtures/vcr_cassettes/user_write_permissions.yml +2 -2
- data/spec/fixtures/vcr_cassettes/users.yml +2 -2
- data/spec/fixtures/vcr_cassettes/users_answers.yml +2 -2
- data/spec/fixtures/vcr_cassettes/users_badges.yml +2 -2
- data/spec/fixtures/vcr_cassettes/users_by_ids.yml +2 -2
- data/spec/fixtures/vcr_cassettes/users_comments.yml +2 -2
- data/spec/fixtures/vcr_cassettes/users_favorites_questions.yml +2 -2
- data/spec/fixtures/vcr_cassettes/users_featured_questions.yml +2 -2
- data/spec/fixtures/vcr_cassettes/users_mentioned_questions.yml +2 -2
- data/spec/fixtures/vcr_cassettes/users_noanswerquestions.yml +2 -2
- data/spec/fixtures/vcr_cassettes/users_notifications.yml +2 -2
- data/spec/fixtures/vcr_cassettes/users_questions.yml +2 -2
- data/spec/fixtures/vcr_cassettes/users_replied_comments.yml +2 -2
- data/spec/fixtures/vcr_cassettes/users_reputation_questions.yml +2 -2
- data/spec/fixtures/vcr_cassettes/users_suggested_edits.yml +2 -2
- data/spec/fixtures/vcr_cassettes/users_tags.yml +2 -2
- data/spec/fixtures/vcr_cassettes/users_unaccepted_questions.yml +2 -2
- data/spec/fixtures/vcr_cassettes/users_unanswered_questions.yml +2 -2
- data/spec/fixtures/vcr_cassettes/users_unread_notifications.yml +2 -2
- data/spec/helper.rb +1 -1
- data/spec/ruby-stackoverflow/badges_spec.rb +14 -8
- data/spec/ruby-stackoverflow/comments_spec.rb +4 -2
- data/spec/ruby-stackoverflow/question_spec.rb +24 -14
- data/spec/ruby-stackoverflow/user_spec.rb +51 -58
- data/spec/spec_helper.rb +3 -3
- metadata +39 -43
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cb8981bf4df204818eb1552cbba8de8571631c0d
|
4
|
+
data.tar.gz: 67b8d1ba0886d74548215f457bf33d7ef04e1e80
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6ca616d8ac6f408d6a46aef8f8bd5439374f39913a24e79d79bf77562a43a9b809b4813d5b3996de99623ba48809adbb213ce89238de248531a3ffc0eedea064
|
7
|
+
data.tar.gz: 158e5ea960dca0786cdce59885cb4e8ca51015c51abd3a7380b36c8f954f317a916edeed18f7dc4c08c3ca776d4d61a8a4d9896ad12981bef65d37361b7b225d
|
data/.travis.yml
ADDED
data/CHANGELOG.md
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Ruby::Stackoverflow
|
1
|
+
# Ruby::Stackoverflow [![Code Climate](https://codeclimate.com/github/raysrashmi/ruby-stackoverflow.png)](https://codeclimate.com/github/raysrashmi/ruby-stackoverflow)
|
2
2
|
|
3
3
|
Ruby toolkit to Stackoverflow API
|
4
4
|
|
@@ -20,11 +20,11 @@ Or install it yourself as:
|
|
20
20
|
|
21
21
|
<a href='https://github.com/raysrashmi/ruby-stackoverflow/wiki/Users-calls'>User Calls</a>
|
22
22
|
<br/>
|
23
|
-
<a href='https://github.com/raysrashmi/ruby-stackoverflow/wiki/
|
23
|
+
<a href='https://github.com/raysrashmi/ruby-stackoverflow/wiki/Questions-Calls'>Questions Calls</a>
|
24
24
|
<br/>
|
25
|
-
<a href='https://github.com/raysrashmi/ruby-stackoverflow/wiki/
|
25
|
+
<a href='https://github.com/raysrashmi/ruby-stackoverflow/wiki/Badges-calls'>Badges Calls</a>
|
26
26
|
<br/>
|
27
|
-
<a href='https://github.com/raysrashmi/ruby-stackoverflow/wiki/
|
27
|
+
<a href='https://github.com/raysrashmi/ruby-stackoverflow/wiki/Comments-calls'>Comments Calls</a>
|
28
28
|
<br/>
|
29
29
|
|
30
30
|
##Configuration
|
@@ -33,7 +33,7 @@ You can add your key and access-token for higher rate limit.
|
|
33
33
|
To get Key and Access Token you have to register your app to http://stackapps.com/
|
34
34
|
Run command in your application dir.
|
35
35
|
|
36
|
-
$ rails generate
|
36
|
+
$ rails generate ruby_stackoverflow --client_key=<key> --access_token=<access token>
|
37
37
|
|
38
38
|
This command will create a ruby_stackoverflow.rb file in config/initializers.
|
39
39
|
|
@@ -47,4 +47,3 @@ This command will create a ruby_stackoverflow.rb file in config/initializers.
|
|
47
47
|
|
48
48
|
##LICENSE
|
49
49
|
|
50
|
-
|
@@ -14,7 +14,7 @@ class RubyStackoverflowGenerator < Rails::Generators::Base
|
|
14
14
|
end
|
15
15
|
|
16
16
|
private
|
17
|
-
|
17
|
+
|
18
18
|
def configuration_output
|
19
19
|
output = <<-eos
|
20
20
|
RubyStackoverflow.configure do|config|
|
@@ -24,8 +24,4 @@ end
|
|
24
24
|
eos
|
25
25
|
output
|
26
26
|
end
|
27
|
-
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
|
27
|
+
end
|
data/lib/ruby-stackoverflow.rb
CHANGED
@@ -8,8 +8,7 @@ module RubyStackoverflow
|
|
8
8
|
|
9
9
|
class << self
|
10
10
|
def client
|
11
|
-
@client
|
12
|
-
@client
|
11
|
+
@client ||= RubyStackoverflow::Client.new
|
13
12
|
end
|
14
13
|
|
15
14
|
# @private
|
@@ -17,13 +16,11 @@ module RubyStackoverflow
|
|
17
16
|
# @private
|
18
17
|
def respond_to?(method_name, include_private=false); client.respond_to?(method_name, include_private) || super; end if RUBY_VERSION < "1.9"
|
19
18
|
|
20
|
-
|
19
|
+
private
|
21
20
|
|
22
21
|
def method_missing(method_name, *args, &block)
|
23
22
|
return super unless client.respond_to?(method_name)
|
24
23
|
client.send(method_name, *args, &block)
|
25
24
|
end
|
26
|
-
|
27
25
|
end
|
28
26
|
end
|
29
|
-
|
@@ -1,49 +1,46 @@
|
|
1
1
|
module RubyStackoverflow
|
2
2
|
class Client
|
3
3
|
module BadgesHelper
|
4
|
-
|
5
|
-
def badges(options={})
|
4
|
+
def badges(options = {})
|
6
5
|
badges_response(options)
|
7
|
-
end
|
6
|
+
end
|
8
7
|
|
9
|
-
def badges_by_ids(ids, options={})
|
10
|
-
|
11
|
-
url = ids
|
8
|
+
def badges_by_ids(ids, options = {})
|
9
|
+
url = join_ids(ids)
|
12
10
|
badges_response(options, url)
|
13
|
-
end
|
11
|
+
end
|
14
12
|
|
15
|
-
def badges_by_ids(ids, options={})
|
16
|
-
|
17
|
-
url = ids
|
13
|
+
def badges_by_ids(ids, options = {})
|
14
|
+
url = join_ids(ids)
|
18
15
|
badges_response(options, url)
|
19
|
-
end
|
16
|
+
end
|
20
17
|
|
21
|
-
def badges_by_name(options={})
|
22
|
-
url =
|
18
|
+
def badges_by_name(options = {})
|
19
|
+
url = "/name"
|
23
20
|
badges_response(options, url)
|
24
|
-
end
|
21
|
+
end
|
25
22
|
|
26
|
-
def badges_between_dates(options={})
|
27
|
-
url =
|
23
|
+
def badges_between_dates(options = {})
|
24
|
+
url = "/recipients"
|
28
25
|
badges_response(options, url)
|
29
|
-
end
|
26
|
+
end
|
30
27
|
|
31
|
-
def badges_between_dates_by_ids(ids,options={})
|
28
|
+
def badges_between_dates_by_ids(ids, options = {})
|
32
29
|
ids = join_ids(ids)
|
33
|
-
url = ids +
|
30
|
+
url = ids + "/recipients"
|
34
31
|
badges_response(options, url)
|
35
|
-
end
|
32
|
+
end
|
36
33
|
|
37
|
-
def badges_by_tags(options={})
|
38
|
-
url =
|
34
|
+
def badges_by_tags(options = {})
|
35
|
+
url = "/tags"
|
39
36
|
badges_response(options, url)
|
40
|
-
end
|
37
|
+
end
|
41
38
|
|
42
39
|
private
|
43
40
|
|
44
|
-
def badges_response(options={}, url=
|
45
|
-
url =
|
46
|
-
getr(url,
|
41
|
+
def badges_response(options = {}, url= "")
|
42
|
+
url = "badges/" + url
|
43
|
+
getr(url, "badge", options)
|
47
44
|
end
|
48
45
|
end
|
49
46
|
end
|
@@ -1,22 +1,20 @@
|
|
1
1
|
module RubyStackoverflow
|
2
2
|
class Client
|
3
3
|
module CommentsHelper
|
4
|
-
|
5
4
|
def comments(options = {})
|
6
|
-
comments_response(options)
|
5
|
+
comments_response(options)
|
7
6
|
end
|
8
|
-
|
7
|
+
|
9
8
|
def comments_by_ids(ids, options = {})
|
10
|
-
|
11
|
-
url
|
12
|
-
comments_response(options, url)
|
9
|
+
url = join_ids(ids)
|
10
|
+
comments_response(options, url)
|
13
11
|
end
|
14
12
|
|
15
13
|
private
|
16
14
|
|
17
15
|
def comments_response(options={}, url='')
|
18
16
|
url = 'comments/' + url
|
19
|
-
getr(url,'comment',options)
|
17
|
+
getr(url, 'comment', options)
|
20
18
|
end
|
21
19
|
end
|
22
20
|
end
|
@@ -1,20 +1,19 @@
|
|
1
1
|
module RubyStackoverflow
|
2
2
|
class Client
|
3
3
|
module ParseOptions
|
4
|
-
|
5
4
|
def parse_options(options = {})
|
6
5
|
options.each do|k,v|
|
7
6
|
case k
|
8
7
|
when :fromdate , :todate, :min, :max
|
9
8
|
begin
|
10
|
-
options[k] =
|
9
|
+
options[k] = Time.parse(v).to_i
|
11
10
|
rescue
|
12
11
|
options[k] = v
|
13
12
|
end
|
14
13
|
else
|
15
14
|
options[k] = v
|
16
15
|
end
|
17
|
-
end
|
16
|
+
end
|
18
17
|
end
|
19
18
|
|
20
19
|
def join_ids(ids)
|
@@ -1,7 +1,6 @@
|
|
1
1
|
module RubyStackoverflow
|
2
2
|
class Client
|
3
3
|
module QuestionHelper
|
4
|
-
|
5
4
|
def questions(options = {})
|
6
5
|
question_response(options)
|
7
6
|
end
|
@@ -51,10 +50,9 @@ module RubyStackoverflow
|
|
51
50
|
|
52
51
|
private
|
53
52
|
|
54
|
-
|
55
53
|
def question_response(options={}, url='')
|
56
54
|
url = 'questions/' + url
|
57
|
-
getr(url,'question',options)
|
55
|
+
getr(url, 'question', options)
|
58
56
|
end
|
59
57
|
end
|
60
58
|
end
|
@@ -31,15 +31,15 @@ module RubyStackoverflow
|
|
31
31
|
|
32
32
|
def data_has_answer?(data)
|
33
33
|
data.first.include?(:answer_id)
|
34
|
-
end
|
34
|
+
end
|
35
35
|
|
36
36
|
def data_has_comment?(data)
|
37
37
|
data.first.include?(:comment_id) && !data.first.include?(:timeline_type)
|
38
|
-
end
|
38
|
+
end
|
39
39
|
|
40
40
|
def data_has_timeline?(data)
|
41
41
|
data.first.include?(:timeline_type)
|
42
|
-
end
|
42
|
+
end
|
43
43
|
|
44
44
|
def find_or_create_question(questions, qid)
|
45
45
|
question_array = questions.select{|q|q.question_id == qid}
|
@@ -47,9 +47,9 @@ module RubyStackoverflow
|
|
47
47
|
end
|
48
48
|
|
49
49
|
|
50
|
-
def create_question(attr_hash, questions, hash_key)
|
50
|
+
def create_question(attr_hash, questions, hash_key)
|
51
51
|
qid = attr_hash.delete(hash_key)
|
52
|
-
question = find_or_create_question(questions, qid)
|
52
|
+
question = find_or_create_question(questions, qid)
|
53
53
|
questions << question unless question_exists?(questions,qid)
|
54
54
|
question
|
55
55
|
end
|
@@ -58,9 +58,7 @@ module RubyStackoverflow
|
|
58
58
|
question_array = questions.select{|q|q.question_id == question_id }
|
59
59
|
!question_array.empty?
|
60
60
|
end
|
61
|
-
|
62
61
|
end
|
63
|
-
|
64
62
|
end
|
65
63
|
end
|
66
64
|
end
|
@@ -1,19 +1,6 @@
|
|
1
1
|
module RubyStackoverflow
|
2
2
|
class Client
|
3
3
|
class Tag < Resource
|
4
|
-
#def initialize(attributes_hash)
|
5
|
-
#Tag.define_atribute_methods(attributes_hash)
|
6
|
-
#end
|
7
|
-
|
8
|
-
#class << self
|
9
|
-
#def define_atribute_methods(attributes_hash)
|
10
|
-
#attributes_hash.each do|k,v|
|
11
|
-
#define_method(k) do v; end
|
12
|
-
#end
|
13
|
-
#end
|
14
|
-
#end
|
15
4
|
end
|
16
5
|
end
|
17
6
|
end
|
18
|
-
|
19
|
-
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module RubyStackoverflow
|
2
2
|
class Client
|
3
3
|
class User < Resource
|
4
|
-
attr_reader :badges, :answers, :comments,
|
4
|
+
attr_reader :badges, :answers, :comments,
|
5
5
|
:questions, :reputations,
|
6
6
|
:suggested_edits, :tags, :posts, :permissions
|
7
7
|
|
@@ -65,10 +65,10 @@ module RubyStackoverflow
|
|
65
65
|
!user_array.empty? ? user_array.first : new(user_attr)
|
66
66
|
end
|
67
67
|
|
68
|
-
def create_user(attr_hash, users, hash_key=:owner)
|
68
|
+
def create_user(attr_hash, users, hash_key=:owner)
|
69
69
|
user_attr = attr_hash.delete(hash_key)
|
70
|
-
user_attr = user_attr.is_a?(Hash) ? user_attr : {user_id: user_attr }
|
71
|
-
user = find_or_create_user(users, user_attr)
|
70
|
+
user_attr = user_attr.is_a?(Hash) ? user_attr : {user_id: user_attr }
|
71
|
+
user = find_or_create_user(users, user_attr)
|
72
72
|
users << user unless user_exists?(users, user_attr[:user_id])
|
73
73
|
user
|
74
74
|
end
|
@@ -1,14 +1,14 @@
|
|
1
|
-
|
2
1
|
module RubyStackoverflow
|
3
2
|
class Client
|
4
3
|
class ResponseData
|
5
|
-
attr_reader :data, :error
|
4
|
+
attr_reader :data, :has_more, :error
|
6
5
|
|
7
6
|
def initialize(response, klass)
|
8
7
|
if response[:items].nil?
|
9
|
-
@error =
|
8
|
+
@error = StackoverflowError.new(response)
|
10
9
|
else
|
11
10
|
@data = format_data(response[:items], klass)
|
11
|
+
@has_more = response[:has_more]
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -34,16 +34,16 @@ module RubyStackoverflow
|
|
34
34
|
user_response(options, url)
|
35
35
|
end
|
36
36
|
|
37
|
-
|
37
|
+
def users_notifications(id, options = {})
|
38
38
|
url = id + '/notifications'
|
39
39
|
user_response(options, url)
|
40
40
|
end
|
41
41
|
|
42
|
-
|
42
|
+
def users_unread_notifications(id, options = {})
|
43
43
|
url = id + '/notifications/unread'
|
44
44
|
user_response(options, url)
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
def users_with_favorites_questions(ids, options = {})
|
48
48
|
ids = join_ids(ids)
|
49
49
|
url = ids + '/favorites'
|
@@ -114,6 +114,11 @@ module RubyStackoverflow
|
|
114
114
|
user_response(options, url)
|
115
115
|
end
|
116
116
|
|
117
|
+
def user_top_tags(id, options ={})
|
118
|
+
url = id + '/top-tags'
|
119
|
+
user_response(options, url)
|
120
|
+
end
|
121
|
+
|
117
122
|
def user_top_tags_by_answers(id, options ={})
|
118
123
|
url = id + '/top-answer-tags'
|
119
124
|
user_response(options, url)
|
@@ -142,10 +147,9 @@ module RubyStackoverflow
|
|
142
147
|
|
143
148
|
private
|
144
149
|
|
145
|
-
|
146
150
|
def user_response(options={}, url='')
|
147
151
|
url = 'users/'+ url
|
148
|
-
getr(url,'user',options)
|
152
|
+
getr(url, 'user', options)
|
149
153
|
end
|
150
154
|
end
|
151
155
|
end
|