rubyoverflow 0.5 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/README.rdoc +22 -11
  2. data/RELEASENOTES +97 -1
  3. data/Rakefile +49 -7
  4. data/VERSION +1 -1
  5. data/lib/rubyoverflow.rb +92 -18
  6. data/lib/rubyoverflow/answer.rb +61 -0
  7. data/lib/rubyoverflow/answers.rb +60 -0
  8. data/lib/rubyoverflow/apiSite.rb +32 -0
  9. data/lib/rubyoverflow/apiSites.rb +25 -0
  10. data/lib/rubyoverflow/apiVersion.rb +6 -0
  11. data/lib/rubyoverflow/badge.rb +44 -0
  12. data/lib/rubyoverflow/badgeCounts.rb +22 -0
  13. data/lib/rubyoverflow/badges.rb +59 -0
  14. data/lib/rubyoverflow/base.rb +76 -0
  15. data/lib/rubyoverflow/comment.rb +41 -0
  16. data/lib/rubyoverflow/comments.rb +115 -0
  17. data/lib/rubyoverflow/errors.rb +17 -0
  18. data/lib/rubyoverflow/pagedBase.rb +27 -0
  19. data/lib/rubyoverflow/pagedDash.rb +7 -0
  20. data/lib/rubyoverflow/postTimelineEvent.rb +93 -0
  21. data/lib/rubyoverflow/postTimelineEvents.rb +39 -0
  22. data/lib/rubyoverflow/question.rb +110 -0
  23. data/lib/rubyoverflow/questions.rb +104 -0
  24. data/lib/rubyoverflow/repChange.rb +34 -0
  25. data/lib/rubyoverflow/repChanges.rb +41 -0
  26. data/lib/rubyoverflow/revision.rb +62 -0
  27. data/lib/rubyoverflow/revisions.rb +52 -0
  28. data/lib/rubyoverflow/statistics.rb +57 -0
  29. data/lib/rubyoverflow/styling.rb +19 -0
  30. data/lib/rubyoverflow/tag.rb +27 -0
  31. data/lib/rubyoverflow/tags.rb +46 -0
  32. data/lib/rubyoverflow/user.rb +181 -0
  33. data/lib/rubyoverflow/userTimelineEvent.rb +43 -0
  34. data/lib/rubyoverflow/userTimelineEvents.rb +35 -0
  35. data/lib/rubyoverflow/users.rb +67 -18
  36. data/test/apiKey.rb +5 -0
  37. data/test/helper.rb +159 -0
  38. data/test/test_answer.rb +20 -0
  39. data/test/test_answers.rb +32 -0
  40. data/test/test_badge.rb +18 -0
  41. data/test/test_badges.rb +30 -0
  42. data/test/test_base.rb +63 -0
  43. data/test/test_statistics.rb +26 -0
  44. data/test/test_user.rb +56 -0
  45. data/test/test_users.rb +37 -0
  46. metadata +122 -87
  47. data/.gitignore +0 -4
  48. data/.rvmrc +0 -47
  49. data/.travis.yml +0 -5
  50. data/Gemfile +0 -3
  51. data/lib/rubyoverflow/sites.rb +0 -20
  52. data/lib/rubyoverflow/version.rb +0 -3
  53. data/rubyoverflow.gemspec +0 -26
  54. data/spec/sites_spec.rb +0 -18
  55. data/spec/spec_helper.rb +0 -3
  56. data/spec/users_spec.rb +0 -23
@@ -0,0 +1,27 @@
1
+ module Rubyoverflow
2
+ class PagedBase < Base
3
+ attr_reader :total, :pagesize, :page, :request_path, :query_parameters
4
+
5
+ def initialize(dash, request_path)
6
+ @total = dash.total
7
+ @page = dash.page
8
+ @pagesize = dash.pagesize
9
+ @request_path,@query_parameters = find_parse_querystring(request_path)
10
+ end
11
+
12
+ def next_page_parameters()
13
+ temp = @query_parameters
14
+ if @page.respond_to?(:to_int)
15
+ temp['page'] = @page.to_i + 1
16
+ else
17
+ temp["page"] = 2
18
+ end
19
+ return temp
20
+ end
21
+
22
+ def perform_next_page_request()
23
+ request(@request_path,next_page_parameters)
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,7 @@
1
+ module Rubyoverflow
2
+ class PagedDash < BaseDash
3
+ property :total
4
+ property :pagesize
5
+ property :page
6
+ end
7
+ end
@@ -0,0 +1,93 @@
1
+ module Rubyoverflow
2
+ class PostTimelineEvent < Base
3
+ attr_reader :timeline_type
4
+ attr_reader :question_id
5
+ attr_reader :post_id
6
+ attr_reader :comment_id
7
+ attr_reader :revision_guid
8
+ attr_reader :creation_date
9
+ attr_reader :user
10
+ attr_reader :owner
11
+ attr_reader :action
12
+ attr_reader :post_revision_url
13
+ attr_reader :post_url
14
+ attr_reader :post_comment_url
15
+
16
+ def initialize(hash, request_path = '')
17
+ dash = PostTimelineEventDash.new hash
18
+
19
+ @timeline_type = dash.timeline_type
20
+ @post_id = dash.post_id
21
+ @comment_id = dash.comment_id
22
+ @question_id = dash.question_id
23
+ @revision_guid = dash.revision_guid
24
+ @creation_date = dash.creation_date
25
+ @user = User.new dash.user if dash.user
26
+ @owner = User.new dash.owner if dash.owner
27
+ @action = dash.action
28
+ @post_revision_url = dash.post_revision_url
29
+ @post_url = dash.post_url
30
+ @post_comment_url = dash.post_comment_url
31
+ end
32
+
33
+ #Gets the post associated with this postTimelineEvent
34
+ def get_post(parameters={})
35
+ if @post_url
36
+ hash,url = request(@post_url, parameters)
37
+ if @post_url.include? 'question'
38
+ Questions.new hash, url
39
+ elsif @post_url.include? 'answer'
40
+ Answers.new hash, url
41
+ end
42
+ else
43
+ nil
44
+ end
45
+ end
46
+
47
+ #Gets the question that this postTimleineEvent belongs to
48
+ def get_parent_question(parameters={})
49
+ if @question_id
50
+ Questions.retrieve_by_id @question_id
51
+ else
52
+ nil
53
+ end
54
+ end
55
+
56
+
57
+ #Gets the revision associated with this postTimelineEvent
58
+ def get_post_revision(parameters={})
59
+ if @post_revision_url
60
+ hash,url = request(@post_revision_url, parameters)
61
+ Revisions.new hash, url
62
+ else
63
+ nil
64
+ end
65
+ end
66
+
67
+ #Gets the comment associated with this postTimelineEvent
68
+ def get_post_comment(parameters={})
69
+ if @post_comment_url
70
+ hash,url = request(@post_comment_url, parameters)
71
+ Comments.new hash, url
72
+ else
73
+ nil
74
+ end
75
+ end
76
+
77
+ end
78
+
79
+ class PostTimelineEventDash < BaseDash
80
+ property :timeline_type
81
+ property :post_id
82
+ property :question_id
83
+ property :comment_id
84
+ property :revision_guid
85
+ property :creation_date
86
+ property :user
87
+ property :owner
88
+ property :action
89
+ property :post_revision_url
90
+ property :post_url
91
+ property :post_comment_url
92
+ end
93
+ end
@@ -0,0 +1,39 @@
1
+ module Rubyoverflow
2
+ class PostTimelineEvents < PagedBase
3
+ attr_reader :post_timelines
4
+
5
+ def initialize(hash, request_path = '')
6
+ dash = PostTimelineEventsDash.new hash
7
+ super(dash, request_path)
8
+
9
+ @post_timelines = Array.new
10
+ dash.post_timelines.each {|postTimeHash| @post_timelines.push(PostTimelineEvent.new postTimeHash)}
11
+ end
12
+
13
+ #Retrieves the next set of PostTimelineEvents using the same parameters used to retrieve the current set
14
+ def get_next_set
15
+ hash,url = perform_next_page_request
16
+ PostTimelineEvents.new hash,url
17
+ end
18
+
19
+ class << self
20
+
21
+ #Retrieve a set of PostTimelineEvent for a set of question(s) by their id(s)
22
+ #
23
+ #id can be an int, string, or an array of ints or strings
24
+ #
25
+ #Maps to 'questions/{id}/timeline'
26
+ def retrieve_by_question(id, parameters = {})
27
+ id = convert_to_id_list(id)
28
+
29
+ hash, url = request('questions/' + id.to_s + '/timeline', parameters)
30
+ PostTimelineEvents.new hash, url
31
+ end
32
+ end
33
+
34
+ end
35
+
36
+ class PostTimelineEventsDash < PagedDash
37
+ property :post_timelines
38
+ end
39
+ end
@@ -0,0 +1,110 @@
1
+ module Rubyoverflow
2
+ class Question < Base
3
+ attr_reader :tags, :answer_count, :answers, :accepted_answer_id, :favorite_count, :bounty_closes_date,
4
+ :bounty_amount, :closed_date, :closed_reason, :question_timeline_url, :question_comments_url,
5
+ :question_answers_url, :question_id, :locked_date, :owner, :creation_date, :last_edit_date,
6
+ :last_activity_date, :up_vote_count, :down_vote_count, :view_count, :score, :community_owned,
7
+ :title, :body, :comments, :migrated, :protected_date
8
+
9
+ def initialize(hash, request_path = '')
10
+ dash = QuestionDash.new hash
11
+
12
+ @tags = Array.new
13
+ @comments = Array.new
14
+ @answers = Array.new
15
+
16
+ dash.tags.each {|tag| @tags.push(tag)} if dash.tags
17
+ dash.comments.each {|commentHash| @comment.push(Comment.new commentHash)} if dash.comments
18
+ dash.answers.each {|answerHash| @comment.push(Answer.new answerHash)} if dash.answers
19
+
20
+ @migrated = dash.migrated
21
+ @answer_count = dash.answer_count
22
+ @accepted_answer_id = dash.accepted_answer_id
23
+ @favorite_count = dash.favorite_count
24
+ @bounty_closes_date = dash.bounty_closes_date
25
+ @bounty_amount = dash.bounty_amount
26
+ @closed_date = dash.closed_date
27
+ @closed_reason = dash.closed_reason
28
+ @question_timeline_url = dash.question_timeline_url
29
+ @question_comments_url = dash.question_comments_url
30
+ @question_answers_url = dash.question_answers_url
31
+ @question_id = dash.question_id
32
+ @locked_date = dash.locked_date
33
+ @owner = User.new dash.owner if dash.owner
34
+ @creation_date = dash.creation_date
35
+ @last_edit_date = dash.last_edit_date
36
+ @last_activity_date = dash.last_activity_date
37
+ @up_vote_count = dash.up_vote_count
38
+ @down_vote_count = dash.down_vote_count
39
+ @view_count = dash.view_count
40
+ @score = dash.score
41
+ @community_owned = dash.community_owned
42
+ @title = dash.title
43
+ @body = dash.body
44
+ @protected_date = dash.protected_date
45
+ end
46
+
47
+ #Gets the comments made on the question
48
+ def get_comments(parameters = {})
49
+ if @question_comments_url
50
+ hash,url =request(@question_comments_url, parameters)
51
+ Comments.new hash, url
52
+ else
53
+ nil
54
+ end
55
+ end
56
+
57
+ #Gets the answers posted to the question
58
+ def get_answers(parameters = {})
59
+ if @question_answers_url
60
+ hash,url =request(@question_answers_url, parameters)
61
+ Answers.new hash, url
62
+ else
63
+ nil
64
+ end
65
+ end
66
+
67
+ #Gets the timeline for the question
68
+ def get_timeline(parameters = {})
69
+ if @question_timeline_url
70
+ hash,url =request(@question_timeline_url, parameters)
71
+ PostTimelineEvents.new hash, url
72
+ else
73
+ nil
74
+ end
75
+ end
76
+
77
+
78
+ end
79
+
80
+ class QuestionDash < BaseDash
81
+ property :tags
82
+ property :answer_count
83
+ property :answers
84
+ property :accepted_answer_id
85
+ property :favorite_count
86
+ property :bounty_closes_date
87
+ property :bounty_amount
88
+ property :closed_date
89
+ property :closed_reason
90
+ property :question_timeline_url
91
+ property :question_comments_url
92
+ property :question_answers_url
93
+ property :question_id
94
+ property :locked_date
95
+ property :owner
96
+ property :creation_date
97
+ property :last_edit_date
98
+ property :last_activity_date
99
+ property :up_vote_count
100
+ property :down_vote_count
101
+ property :view_count
102
+ property :score
103
+ property :community_owned
104
+ property :title
105
+ property :body
106
+ property :comments
107
+ property :migrated
108
+ property :protected_date
109
+ end
110
+ end
@@ -0,0 +1,104 @@
1
+ module Rubyoverflow
2
+ class Questions < PagedBase
3
+ attr_reader :questions
4
+
5
+ def initialize(hash, request_path = '')
6
+ dash = QuestionsDash.new hash
7
+
8
+ @questions = Array.new
9
+ dash.questions.each {|questionHash| @questions.push(Question.new questionHash)}
10
+
11
+ super(dash,request_path)
12
+ end
13
+
14
+ #Retrieves the next set of questions using the same parameters used to retrieve the current set
15
+ def get_next_set
16
+ hash,url = perform_next_page_request
17
+ Questions.new hash,url
18
+ end
19
+
20
+ class << self
21
+
22
+ #Retrieves all questions using the parameters provided
23
+ #
24
+ #Maps to '/questions'
25
+ def retrieve_all(parameters = {})
26
+ hash, url = request('questions',parameters)
27
+ Questions.new hash, url
28
+ end
29
+
30
+ #Retrieves a set of questions by their id(s)
31
+ #
32
+ #id can be an int, string, or an array of ints or strings
33
+ #
34
+ #Maps to '/questions/{id}'
35
+ def retrieve_by_id(id, parameters = {})
36
+ id = convert_to_id_list(id)
37
+
38
+ hash, url = request('questions/' + id.to_s, parameters)
39
+ Questions.new hash, url
40
+ end
41
+
42
+ #Retrieves a set of questions by their tag(s)
43
+ #
44
+ #tag can be a string or an array of strings, tag(s) should be URL Encoded
45
+ #
46
+ #Maps to '/questions/tagged/{tags}
47
+ def retrieve_by_tag(tags, parameters = {})
48
+ tags = convert_to_id_list(tags)
49
+ parameters['tagged'] = tags
50
+ hash, url = request('questions/', parameters)
51
+ Questions.new hash, url
52
+ end
53
+
54
+ #Retieves a set of unanswered questions using the parameters provided
55
+ #
56
+ #Maps to '/questions/unanswered'
57
+ def retrieve_unanswered(parameters = {})
58
+ hash, url = request('questions/unanswered', parameters)
59
+ Questions.new hash, url
60
+ end
61
+
62
+ #Retrieves a set of favorite questions for user(s) by the users' id(s)
63
+ #
64
+ #user_id can be an int, string, or an array of ints or strings
65
+ #
66
+ #Maps to '/users/{id}/favorites
67
+ def retrieve_favorites(user_id, parameters = {})
68
+ user_id = convert_to_id_list(user_id)
69
+
70
+ hash, url = request('users/'+user_id.to_s+'/favorites', parameters)
71
+ Questions.new hash, url
72
+ end
73
+
74
+ #Retrieve question summary for user(s) by their id(s)
75
+ #
76
+ #id can be an int, string, or an array of ints or strings
77
+ #
78
+ #Maps to '/users/{id}/questions'
79
+ def retrieve_by_user(id, parameters = {})
80
+ id = convert_to_id_list(id)
81
+
82
+ hash, url = request('users/'+id.to_s+'/questions', parameters)
83
+ Questions.new hash, url
84
+ end
85
+
86
+ #Searches questions. One of intitle, tagged, or nottagged must be set.
87
+ #
88
+ #Example: Questions.search({:tagged=>'c%23',:nottagged=>'sql;asp.net'})
89
+ #
90
+ #Maps to '/search'
91
+ def search(parameters = {})
92
+ hash, url = request('search', parameters)
93
+ Questions.new hash, url
94
+ end
95
+
96
+ end
97
+
98
+
99
+ end
100
+
101
+ class QuestionsDash < PagedDash
102
+ property :questions
103
+ end
104
+ end
@@ -0,0 +1,34 @@
1
+ module Rubyoverflow
2
+ class RepChange
3
+ attr_reader :user_id
4
+ attr_reader :post_id
5
+ attr_reader :post_type
6
+ attr_reader :title
7
+ attr_reader :positive_rep
8
+ attr_reader :negative_rep
9
+ attr_reader :on_date
10
+
11
+ def initialize(hash, request_path = '')
12
+ dash = RepChangeDash.new hash
13
+
14
+ @user_id = dash.user_id
15
+ @post_id = dash.post_id
16
+ @post_type = dash.post_type
17
+ @title = dash.title
18
+ @positive_rep = dash.positive_rep
19
+ @negative_rep = dash.negative_rep
20
+ @on_date = dash.on_date
21
+ end
22
+
23
+ end
24
+
25
+ class RepChangeDash <BaseDash
26
+ property :user_id
27
+ property :post_id
28
+ property :post_type
29
+ property :title
30
+ property :positive_rep
31
+ property :negative_rep
32
+ property :on_date
33
+ end
34
+ end
@@ -0,0 +1,41 @@
1
+ module Rubyoverflow
2
+ class RepChanges < PagedBase
3
+
4
+ attr_reader :rep_changes
5
+
6
+ def initialize(hash, request_path = '')
7
+ dash = RepChangesDash.new hash
8
+ super(dash, request_path)
9
+
10
+ @rep_changes = Array.new
11
+ dash.rep_changes.each{|repHash| @rep_changes.push(RepChange.new repHash)}
12
+ end
13
+
14
+ #Retrieves the next set of RepChanges using the same parameters used to retrieve the current set
15
+ def get_next_set
16
+ hash,url = perform_next_page_request
17
+ RepChanges.new hash,url
18
+ end
19
+
20
+ class << self
21
+
22
+ #Retrieves all the rep_changes for a set of user(s) by their id(s)
23
+ #
24
+ #id can be an int, string, or an array of ints or strings
25
+ #
26
+ #Maps to '/users{id}/reputation'
27
+ def retrieve_by_user(id, parameters={})
28
+ id = convert_to_id_list(id)
29
+ hash, url = request('/users/' + id.to_s + '/reputation', parameters)
30
+ RepChanges.new hash, url
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+
37
+ class RepChangesDash < PagedDash
38
+ property :rep_changes
39
+
40
+ end
41
+ end