pilha 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. data/lib/pilha.rb +7 -10
  2. data/lib/pilha/stack_overflow/answer.rb +7 -8
  3. data/lib/pilha/stack_overflow/badge.rb +8 -6
  4. data/lib/pilha/stack_overflow/base.rb +27 -0
  5. data/lib/pilha/stack_overflow/comment.rb +21 -9
  6. data/lib/pilha/stack_overflow/question.rb +41 -0
  7. data/lib/pilha/stack_overflow/statistics.rb +7 -6
  8. data/lib/pilha/stack_overflow/user.rb +5 -8
  9. data/pilha.gemspec +8 -21
  10. data/spec/fixtures/answer_comments.json +37 -0
  11. data/spec/fixtures/answers_by_question_id.json +430 -0
  12. data/spec/fixtures/answers_by_question_id.json.gz +0 -0
  13. data/spec/fixtures/badges_name.json +400 -0
  14. data/spec/fixtures/badges_name.json.gz +0 -0
  15. data/spec/fixtures/comments_by_mentioned_user_id.json +117 -0
  16. data/spec/fixtures/comments_by_mentioned_user_id.json.gz +0 -0
  17. data/spec/fixtures/comments_by_question_id.json +22 -0
  18. data/spec/fixtures/comments_by_question_id.json.gz +0 -0
  19. data/spec/fixtures/comments_by_user_id.json +464 -0
  20. data/spec/fixtures/comments_by_user_id.json.gz +0 -0
  21. data/spec/fixtures/comments_by_user_id_to_mentioned_user_id.json.gz +0 -0
  22. data/spec/fixtures/comments_by_user_to_mentioned_user.json +29 -0
  23. data/spec/fixtures/comments_by_user_to_mentioned_user.json.gz +0 -0
  24. data/spec/fixtures/comments_by_user_to_mentioned_user_id.json.gz +0 -0
  25. data/spec/fixtures/question_by_id.json +162 -0
  26. data/spec/fixtures/question_by_id.json.gz +0 -0
  27. data/spec/fixtures/question_by_id_with_body.json +169 -0
  28. data/spec/fixtures/question_by_id_with_body.json.gz +0 -0
  29. data/spec/fixtures/question_by_user_id.json.gz +0 -0
  30. data/spec/fixtures/questions.json +1773 -0
  31. data/spec/fixtures/questions.json.gz +0 -0
  32. data/spec/fixtures/questions.part +859 -0
  33. data/spec/fixtures/questions_by_user_id.json +35 -0
  34. data/spec/fixtures/questions_by_user_id.json.gz +0 -0
  35. data/spec/fixtures/users.json +983 -0
  36. data/spec/fixtures/users_by_id.json +40 -0
  37. data/spec/fixtures/users_by_id.json.gz +0 -0
  38. data/spec/pilha/stack_overflow/badge_spec.rb +3 -3
  39. data/spec/pilha/stack_overflow/comment_spec.rb +52 -1
  40. data/spec/pilha/stack_overflow/question_spec.rb +63 -0
  41. data/spec/pilha/stack_overflow/stack_overflow_spec.rb +2 -4
  42. data/spec/spec_helper.rb +7 -1
  43. metadata +53 -22
data/lib/pilha.rb CHANGED
@@ -13,6 +13,7 @@ require 'pilha/stack_overflow/badge'
13
13
  require 'pilha/stack_overflow/user'
14
14
  require 'pilha/stack_overflow/answer'
15
15
  require 'pilha/stack_overflow/comment'
16
+ require 'pilha/stack_overflow/question'
16
17
 
17
18
  module StackExchange
18
19
 
@@ -31,7 +32,7 @@ module StackExchange
31
32
  yield options if block_given?
32
33
 
33
34
  client = Client.new(options)
34
- include_client(client, Badge, Statistics, User, Answer, Comment)
35
+ include_client(client, Badge, Statistics, User, Answer, Comment, Question)
35
36
  end
36
37
 
37
38
  def include_client(client, *classes)
@@ -48,7 +49,7 @@ module StackExchange
48
49
  end
49
50
 
50
51
  def api_method_path(pattern, options = {})
51
- pattern << '/' unless pattern.end_with? '/'
52
+ pattern = normalize(pattern)
52
53
  parts = pattern.split('/').select { |part| part =~ /^:/ }
53
54
 
54
55
  parts.each do |part|
@@ -66,7 +67,7 @@ module StackExchange
66
67
 
67
68
  def get(url)
68
69
  stream = open(url) { |stream| Zlib::GzipReader.new(stream).read }
69
- JSON.parse stream
70
+ JSON.parse(stream)
70
71
  end
71
72
 
72
73
  def root_path
@@ -74,18 +75,14 @@ module StackExchange
74
75
  end
75
76
 
76
77
  def request(path, options)
77
- get(api_method_url(path, options))
78
+ get api_method_url(path, options)
78
79
  end
79
80
 
80
81
  private
81
- def key?
82
- !!@api_key
83
- end
84
-
85
82
  def query_string(options)
86
- params = options[:query]
87
- if params
83
+ if params = options[:query]
88
84
  params = params.sort_by { |k, v| k.to_s }
85
+
89
86
  '?' + params.inject([]) do |arr, (key, value)|
90
87
  arr << "#{key}=#{value}"
91
88
  end.join('&')
@@ -22,15 +22,14 @@ module StackExchange
22
22
  request('/questions/:id/answers', id, options)
23
23
  end
24
24
 
25
- private
26
- def parse(response)
27
- response['answers'].each do |answer|
28
- parse_with_class(answer, 'comments', Comment)
29
- parse_with_class(answer, 'owner', User)
30
- end
31
- parse_with_class(response, 'answers', Answer)
32
- OpenStruct.new response
25
+ def parse(response)
26
+ response['answers'].each do |answer|
27
+ parse_with_class(answer, 'comments', Comment)
28
+ parse_with_class(answer, 'owner', User)
33
29
  end
30
+ parse_with_class(response, 'answers', Answer)
31
+ OpenStruct.new response
32
+ end
34
33
  end
35
34
 
36
35
  def initialize(hash)
@@ -1,6 +1,6 @@
1
1
  module StackExchange
2
2
  module StackOverflow
3
- class Badge
3
+ class Badge < Base
4
4
 
5
5
  extend Forwardable
6
6
 
@@ -11,16 +11,19 @@ module StackExchange
11
11
  attr_reader :client
12
12
 
13
13
  def all(options = {})
14
- method = select_method options
15
- response = client.request(method, options)
16
- badges = response['badges']
17
- badges.map { |badge| Badge.new badge }
14
+ method = select_method(options)
15
+ request(method, nil, options)
18
16
  end
19
17
 
20
18
  def select_method(options)
21
19
  tag_based = options[:tag_based] || options['tag_based']
22
20
  tag_based ? '/badges/tags' : '/badges'
23
21
  end
22
+
23
+ def parse(response)
24
+ response['badges'] = response['badges'].map { |badge| Badge.new badge }
25
+ OpenStruct.new response
26
+ end
24
27
  end
25
28
 
26
29
  def initialize(hash)
@@ -30,7 +33,6 @@ module StackExchange
30
33
  def id
31
34
  @struct.badge_id
32
35
  end
33
-
34
36
  end
35
37
  end
36
38
  end
@@ -0,0 +1,27 @@
1
+ module StackExchange
2
+ module StackOverflow
3
+ class Base
4
+
5
+ class << self
6
+ def parse_with_class(hash, key, klass)
7
+ case hash[key]
8
+ when Hash
9
+ hash[key] = klass.new(hash[key])
10
+ when Array
11
+ hash[key] = hash[key].map { |value| klass.new(value) }
12
+ end
13
+ end
14
+
15
+ def request(path_pattern, id, options)
16
+ options.merge! :id => id if id
17
+ parse client.request(path_pattern, options)
18
+ end
19
+
20
+ def client
21
+ StackExchange::StackOverflow::Client.config unless @client
22
+ @client
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -9,7 +9,7 @@ module StackExchange
9
9
  class << self
10
10
  attr_reader :client
11
11
 
12
- def find_by_id(id, options = {})
12
+ def find(id, options = {})
13
13
  request('/comments/:id/', id, options)
14
14
  end
15
15
 
@@ -18,17 +18,25 @@ module StackExchange
18
18
  end
19
19
 
20
20
  def find_by_user_id(id, options = {})
21
- request('/users/:id/comments', id, options)
21
+ if options[:to_user]
22
+ request('/users/:id/comments/:to_user', id, options)
23
+ else
24
+ request('/users/:id/comments', id, options)
25
+ end
26
+ end
27
+
28
+ def find_by_mentioned_user_id(id, options = {})
29
+ request('/users/:id/mentioned', id, options)
22
30
  end
23
31
 
24
- private
25
- def parse(response)
26
- response['comments'].each do |comment|
27
- parse_with_class(comment, 'owner', User)
28
- end
29
- parse_with_class(response, 'comments', Comment)
30
- OpenStruct.new response
32
+ def parse(response)
33
+ response['comments'].each do |comment|
34
+ parse_with_class(comment, 'owner', User)
35
+ parse_with_class(comment, 'reply_to_user', User)
31
36
  end
37
+ parse_with_class(response, 'comments', Comment)
38
+ OpenStruct.new response
39
+ end
32
40
  end
33
41
 
34
42
  def initialize(hash)
@@ -38,6 +46,10 @@ module StackExchange
38
46
  def id
39
47
  @struct.comment_id
40
48
  end
49
+
50
+ def mentioned_user
51
+ @struct.reply_to_user
52
+ end
41
53
  end
42
54
  end
43
55
  end
@@ -0,0 +1,41 @@
1
+ module StackExchange
2
+ module StackOverflow
3
+ class Question < Base
4
+ extend Forwardable
5
+
6
+ def_delegators :@struct, :question_id, :tags, :creation_date, :last_activity_date,
7
+ :up_vote_count, :down_vote_count, :view_count, :score,
8
+ :community_owned, :title, :body, :answers, :answer_count,
9
+ :accepted_answer_id, :favorite_count, :question_timeline_url,
10
+ :question_comments_url, :question_answers_url, :owner
11
+
12
+ class << self
13
+ attr_reader :client
14
+
15
+ def find(id, options = {})
16
+ request('/questions/:id/', id, options).questions.first
17
+ end
18
+
19
+ def find_by_user_id(id, options = {})
20
+ request('/users/:id/questions', id, options)
21
+ end
22
+
23
+ def parse(response)
24
+ response['questions'].each do |comment|
25
+ parse_with_class(comment, 'owner', User)
26
+ end
27
+ parse_with_class(response, 'questions', Question)
28
+ OpenStruct.new response
29
+ end
30
+ end
31
+
32
+ def initialize(hash)
33
+ @struct = OpenStruct.new hash
34
+ end
35
+
36
+ def id
37
+ @struct.question_id
38
+ end
39
+ end
40
+ end
41
+ end
@@ -1,7 +1,6 @@
1
1
  module StackExchange
2
2
  module StackOverflow
3
-
4
- class Statistics
3
+ class Statistics < Base
5
4
 
6
5
  extend Forwardable
7
6
 
@@ -18,12 +17,14 @@ module StackExchange
18
17
  attr_reader :client
19
18
 
20
19
  def all(options = {})
21
- response = client.request('/stats', options)
22
- stats = response['statistics'].first
23
- Statistics.new stats
20
+ request('/stats', nil, options)
24
21
  end
25
- end
26
22
 
23
+ private
24
+ def parse(response)
25
+ Statistics.new response['statistics'].first
26
+ end
27
+ end
27
28
  end
28
29
  end
29
30
  end
@@ -1,6 +1,5 @@
1
1
  module StackExchange
2
2
  module StackOverflow
3
-
4
3
  class User < Base
5
4
  extend Forwardable
6
5
 
@@ -18,7 +17,7 @@ module StackExchange
18
17
  attr_reader :client
19
18
 
20
19
  def all(options = {})
21
- parse client.request('/users', options)
20
+ request('/users', nil, options)
22
21
  end
23
22
 
24
23
  def find_by_badge_id(id, options = {})
@@ -29,12 +28,10 @@ module StackExchange
29
28
  request('/users/:id', id, options).users.first
30
29
  end
31
30
 
32
- private
33
- def parse(response)
34
- users = response['users'].map { |user| User.new(user) }
35
- response['users'] = users
36
- OpenStruct.new response
37
- end
31
+ def parse(response)
32
+ parse_with_class(response, 'users', User)
33
+ OpenStruct.new response
34
+ end
38
35
  end
39
36
 
40
37
  def initialize(hash)
data/pilha.gemspec CHANGED
@@ -1,43 +1,30 @@
1
1
  Gem::Specification.new do |gem|
2
2
  gem.name = "pilha"
3
- gem.version = "0.1.5"
3
+ gem.version = "0.1.6"
4
4
  gem.authors = ["Dalto Curvelano Junior"]
5
5
  gem.description = "A ruby wrapper to the Stack Exchange (Stack Overflow and friends) API."
6
6
  gem.summary = "A ruby wrapper to the Stack Exchange (Stack Overflow and friends) API."
7
+ fixture_files = Dir["spec/fixtures/*"]
7
8
  gem.files = [
8
9
  "pilha.gemspec",
10
+ "lib/pilha.rb",
9
11
  "lib/pilha/stack_overflow/badge.rb",
10
12
  "lib/pilha/stack_overflow/statistics.rb",
11
13
  "lib/pilha/stack_overflow/user.rb",
12
14
  "lib/pilha/stack_overflow/comment.rb",
13
15
  "lib/pilha/stack_overflow/answer.rb",
14
- "lib/pilha.rb",
15
- "spec/fixtures/stats.json",
16
- "spec/fixtures/stats.json.gz",
17
- "spec/fixtures/badges.json",
18
- "spec/fixtures/badges.json.gz",
19
- "spec/fixtures/badges_by_id.json",
20
- "spec/fixtures/badges_by_id.json.gz",
21
- "spec/fixtures/badges_by_id_page2.json",
22
- "spec/fixtures/badges_by_id_page2.json.gz",
23
- "spec/fixtures/badges_tag_based.json",
24
- "spec/fixtures/badges_tag_based.json.gz",
25
- "spec/fixtures/answers_by_id.json",
26
- "spec/fixtures/answers_by_id.json.gz",
27
- "spec/fixtures/answer_with_comments.json",
28
- "spec/fixtures/answer_with_comments.json.gz",
29
- "spec/fixtures/comments.json",
30
- "spec/fixtures/comments.json.gz",
31
- "spec/fixtures/users_answers.json",
32
- "spec/fixtures/users_answers.json.gz",
16
+ "lib/pilha/stack_overflow/question.rb",
17
+ "lib/pilha/stack_overflow/base.rb",
33
18
  "spec/pilha/stack_overflow/badge_spec.rb",
34
19
  "spec/pilha/stack_overflow/stack_overflow_spec.rb",
35
20
  "spec/pilha/stack_overflow/statistics_spec.rb",
36
21
  "spec/pilha/stack_overflow/user_spec.rb",
37
22
  "spec/pilha/stack_overflow/comment_spec.rb",
38
23
  "spec/pilha/stack_overflow/answer_spec.rb",
24
+ "spec/pilha/stack_overflow/question_spec.rb",
39
25
  "spec/spec.opts",
40
- "spec/spec_helper.rb"
26
+ "spec/spec_helper.rb",
27
+ *fixture_files
41
28
  ]
42
29
  gem.homepage = "http://github.com/dlt/pilha"
43
30
  end
@@ -0,0 +1,37 @@
1
+ {
2
+ "total": 2,
3
+ "page": 1,
4
+ "pagesize": 30,
5
+ "comments": [
6
+ {
7
+ "comment_id": 303010,
8
+ "creation_date": 1233120361,
9
+ "owner": {
10
+ "user_id": 26,
11
+ "user_type": "registered",
12
+ "display_name": "Shawn Simon",
13
+ "reputation": 4848,
14
+ "email_hash": "f878a55e08bacee0af48852c29a02dc7"
15
+ },
16
+ "post_id": 555,
17
+ "post_type": "answer",
18
+ "score": 0,
19
+ "body": "a lot of this stuff is situational. i tend not to use session cookies at all. cookies getting hijacked is almost always the servers fault. man in the middle / packet sniffing arent that common"
20
+ },
21
+ {
22
+ "comment_id": 278816,
23
+ "creation_date": 1232410823,
24
+ "owner": {
25
+ "user_id": 13834,
26
+ "user_type": "registered",
27
+ "display_name": "Kevin Loney",
28
+ "reputation": 1971,
29
+ "email_hash": "10f6e15abcf7ed8ca175fd8507e3c19b"
30
+ },
31
+ "post_id": 555,
32
+ "post_type": "answer",
33
+ "score": 0,
34
+ "body": "Given the recent MITM vulnerability surrounding signed SSL certificates (<a href=\"https://blog.startcom.org/?p=145\" rel=\"nofollow\">blog.startcom.org/?p=145</a>) so a combination of SSL and some kind of Challenge response authentication (There are alternatives to SRP) is probably a better solution."
35
+ }
36
+ ]
37
+ }
@@ -0,0 +1,430 @@
1
+ {
2
+ "total": 20,
3
+ "page": 1,
4
+ "pagesize": 30,
5
+ "answers": [
6
+ {
7
+ "answer_id": 2801312,
8
+ "accepted": false,
9
+ "answer_comments_url": "/answers/2801312/comments",
10
+ "question_id": 549,
11
+ "owner": {
12
+ "user_id": 97162,
13
+ "user_type": "registered",
14
+ "display_name": "Manabenz",
15
+ "reputation": 28,
16
+ "email_hash": "f8ba829f1f8b4530dedf3d03e05996dc"
17
+ },
18
+ "creation_date": 1273480517,
19
+ "last_activity_date": 1273480517,
20
+ "up_vote_count": 0,
21
+ "down_vote_count": 0,
22
+ "view_count": 5384,
23
+ "score": 0,
24
+ "community_owned": true,
25
+ "title": "The Definitive Guide To Website Authentication (beta)"
26
+ },
27
+ {
28
+ "answer_id": 552,
29
+ "accepted": false,
30
+ "answer_comments_url": "/answers/552/comments",
31
+ "question_id": 549,
32
+ "owner": {
33
+ "user_id": 136,
34
+ "user_type": "registered",
35
+ "display_name": "Michiel de Mare",
36
+ "reputation": 3758,
37
+ "email_hash": "7c45f63f61e478233f0c2ad3006b178c"
38
+ },
39
+ "creation_date": 1217707505,
40
+ "last_edit_date": 1263840731,
41
+ "last_activity_date": 1263840731,
42
+ "up_vote_count": 16,
43
+ "down_vote_count": 3,
44
+ "view_count": 5384,
45
+ "score": 13,
46
+ "community_owned": false,
47
+ "title": "The Definitive Guide To Website Authentication (beta)"
48
+ },
49
+ {
50
+ "answer_id": 555,
51
+ "accepted": false,
52
+ "answer_comments_url": "/answers/555/comments",
53
+ "question_id": 549,
54
+ "owner": {
55
+ "user_id": 136,
56
+ "user_type": "registered",
57
+ "display_name": "Michiel de Mare",
58
+ "reputation": 3758,
59
+ "email_hash": "7c45f63f61e478233f0c2ad3006b178c"
60
+ },
61
+ "creation_date": 1217709645,
62
+ "last_edit_date": 1236727932,
63
+ "last_activity_date": 1236727932,
64
+ "up_vote_count": 23,
65
+ "down_vote_count": 0,
66
+ "view_count": 5384,
67
+ "score": 23,
68
+ "community_owned": true,
69
+ "title": "The Definitive Guide To Website Authentication (beta)"
70
+ },
71
+ {
72
+ "answer_id": 477579,
73
+ "accepted": false,
74
+ "answer_comments_url": "/answers/477579/comments",
75
+ "question_id": 549,
76
+ "owner": {
77
+ "user_id": 57068,
78
+ "user_type": "registered",
79
+ "display_name": "Jens Roland",
80
+ "reputation": 4900,
81
+ "email_hash": "eafc9ff73a64e9d0d6f949c77d6135b7"
82
+ },
83
+ "creation_date": 1232882907,
84
+ "last_edit_date": 1234515755,
85
+ "last_activity_date": 1234515755,
86
+ "up_vote_count": 13,
87
+ "down_vote_count": 0,
88
+ "view_count": 5384,
89
+ "score": 13,
90
+ "community_owned": false,
91
+ "title": "The Definitive Guide To Website Authentication (beta)"
92
+ },
93
+ {
94
+ "answer_id": 477586,
95
+ "accepted": false,
96
+ "answer_comments_url": "/answers/477586/comments",
97
+ "question_id": 549,
98
+ "owner": {
99
+ "user_id": 57068,
100
+ "user_type": "registered",
101
+ "display_name": "Jens Roland",
102
+ "reputation": 4900,
103
+ "email_hash": "eafc9ff73a64e9d0d6f949c77d6135b7"
104
+ },
105
+ "creation_date": 1232883064,
106
+ "last_edit_date": 1234457020,
107
+ "last_activity_date": 1234457020,
108
+ "up_vote_count": 4,
109
+ "down_vote_count": 0,
110
+ "view_count": 5384,
111
+ "score": 4,
112
+ "community_owned": false,
113
+ "title": "The Definitive Guide To Website Authentication (beta)"
114
+ },
115
+ {
116
+ "answer_id": 477585,
117
+ "accepted": false,
118
+ "answer_comments_url": "/answers/477585/comments",
119
+ "question_id": 549,
120
+ "owner": {
121
+ "user_id": 57068,
122
+ "user_type": "registered",
123
+ "display_name": "Jens Roland",
124
+ "reputation": 4900,
125
+ "email_hash": "eafc9ff73a64e9d0d6f949c77d6135b7"
126
+ },
127
+ "creation_date": 1232883019,
128
+ "last_edit_date": 1234456963,
129
+ "last_activity_date": 1234456963,
130
+ "up_vote_count": 11,
131
+ "down_vote_count": 0,
132
+ "view_count": 5384,
133
+ "score": 11,
134
+ "community_owned": false,
135
+ "title": "The Definitive Guide To Website Authentication (beta)"
136
+ },
137
+ {
138
+ "answer_id": 477584,
139
+ "accepted": false,
140
+ "answer_comments_url": "/answers/477584/comments",
141
+ "question_id": 549,
142
+ "owner": {
143
+ "user_id": 57068,
144
+ "user_type": "registered",
145
+ "display_name": "Jens Roland",
146
+ "reputation": 4900,
147
+ "email_hash": "eafc9ff73a64e9d0d6f949c77d6135b7"
148
+ },
149
+ "creation_date": 1232882995,
150
+ "last_edit_date": 1234456912,
151
+ "last_activity_date": 1234456912,
152
+ "up_vote_count": 8,
153
+ "down_vote_count": 0,
154
+ "view_count": 5384,
155
+ "score": 8,
156
+ "community_owned": false,
157
+ "title": "The Definitive Guide To Website Authentication (beta)"
158
+ },
159
+ {
160
+ "answer_id": 477583,
161
+ "accepted": false,
162
+ "answer_comments_url": "/answers/477583/comments",
163
+ "question_id": 549,
164
+ "owner": {
165
+ "user_id": 57068,
166
+ "user_type": "registered",
167
+ "display_name": "Jens Roland",
168
+ "reputation": 4900,
169
+ "email_hash": "eafc9ff73a64e9d0d6f949c77d6135b7"
170
+ },
171
+ "creation_date": 1232882960,
172
+ "last_edit_date": 1234456725,
173
+ "last_activity_date": 1234456725,
174
+ "up_vote_count": 9,
175
+ "down_vote_count": 0,
176
+ "view_count": 5384,
177
+ "score": 9,
178
+ "community_owned": false,
179
+ "title": "The Definitive Guide To Website Authentication (beta)"
180
+ },
181
+ {
182
+ "answer_id": 477580,
183
+ "accepted": false,
184
+ "answer_comments_url": "/answers/477580/comments",
185
+ "question_id": 549,
186
+ "owner": {
187
+ "user_id": 57068,
188
+ "user_type": "registered",
189
+ "display_name": "Jens Roland",
190
+ "reputation": 4900,
191
+ "email_hash": "eafc9ff73a64e9d0d6f949c77d6135b7"
192
+ },
193
+ "creation_date": 1232882928,
194
+ "last_edit_date": 1234456607,
195
+ "last_activity_date": 1234456607,
196
+ "up_vote_count": 11,
197
+ "down_vote_count": 0,
198
+ "view_count": 5384,
199
+ "score": 11,
200
+ "community_owned": false,
201
+ "title": "The Definitive Guide To Website Authentication (beta)"
202
+ },
203
+ {
204
+ "answer_id": 477578,
205
+ "accepted": true,
206
+ "answer_comments_url": "/answers/477578/comments",
207
+ "question_id": 549,
208
+ "owner": {
209
+ "user_id": 57068,
210
+ "user_type": "registered",
211
+ "display_name": "Jens Roland",
212
+ "reputation": 4900,
213
+ "email_hash": "eafc9ff73a64e9d0d6f949c77d6135b7"
214
+ },
215
+ "creation_date": 1232882866,
216
+ "last_edit_date": 1234456201,
217
+ "last_activity_date": 1234456201,
218
+ "up_vote_count": 29,
219
+ "down_vote_count": 0,
220
+ "view_count": 5384,
221
+ "score": 29,
222
+ "community_owned": false,
223
+ "title": "The Definitive Guide To Website Authentication (beta)"
224
+ },
225
+ {
226
+ "answer_id": 477576,
227
+ "accepted": false,
228
+ "answer_comments_url": "/answers/477576/comments",
229
+ "question_id": 549,
230
+ "owner": {
231
+ "user_id": 57068,
232
+ "user_type": "registered",
233
+ "display_name": "Jens Roland",
234
+ "reputation": 4900,
235
+ "email_hash": "eafc9ff73a64e9d0d6f949c77d6135b7"
236
+ },
237
+ "creation_date": 1232882798,
238
+ "last_activity_date": 1232882798,
239
+ "up_vote_count": 5,
240
+ "down_vote_count": 0,
241
+ "view_count": 5384,
242
+ "score": 5,
243
+ "community_owned": false,
244
+ "title": "The Definitive Guide To Website Authentication (beta)"
245
+ },
246
+ {
247
+ "answer_id": 100522,
248
+ "accepted": false,
249
+ "answer_comments_url": "/answers/100522/comments",
250
+ "question_id": 549,
251
+ "owner": {
252
+ "user_id": 18642,
253
+ "user_type": "registered",
254
+ "display_name": "VP",
255
+ "reputation": 1319,
256
+ "email_hash": "ac35f0b2f290c9e5bfdcdd79f7126d9b"
257
+ },
258
+ "creation_date": 1221813500,
259
+ "last_activity_date": 1221813500,
260
+ "up_vote_count": 0,
261
+ "down_vote_count": 0,
262
+ "view_count": 5384,
263
+ "score": 0,
264
+ "community_owned": false,
265
+ "title": "The Definitive Guide To Website Authentication (beta)"
266
+ },
267
+ {
268
+ "answer_id": 96101,
269
+ "accepted": false,
270
+ "answer_comments_url": "/answers/96101/comments",
271
+ "question_id": 549,
272
+ "owner": {
273
+ "user_id": 15467,
274
+ "user_type": "registered",
275
+ "display_name": "ja",
276
+ "reputation": 1399,
277
+ "email_hash": "357a20e8c56e69d6f9734d23ef9517e8"
278
+ },
279
+ "creation_date": 1221766512,
280
+ "last_activity_date": 1221766512,
281
+ "up_vote_count": 2,
282
+ "down_vote_count": 2,
283
+ "view_count": 5384,
284
+ "score": 0,
285
+ "community_owned": false,
286
+ "title": "The Definitive Guide To Website Authentication (beta)"
287
+ },
288
+ {
289
+ "answer_id": 83980,
290
+ "accepted": false,
291
+ "answer_comments_url": "/answers/83980/comments",
292
+ "question_id": 549,
293
+ "owner": {
294
+ "user_id": 16023,
295
+ "user_type": "registered",
296
+ "display_name": "Asgeir S. Nilsen",
297
+ "reputation": 494,
298
+ "email_hash": "d9bd6d3fb9b5846e88e7677418a4d466"
299
+ },
300
+ "creation_date": 1221662587,
301
+ "last_activity_date": 1221662587,
302
+ "up_vote_count": 1,
303
+ "down_vote_count": 1,
304
+ "view_count": 5384,
305
+ "score": 0,
306
+ "community_owned": false,
307
+ "title": "The Definitive Guide To Website Authentication (beta)"
308
+ },
309
+ {
310
+ "answer_id": 80838,
311
+ "accepted": false,
312
+ "answer_comments_url": "/answers/80838/comments",
313
+ "question_id": 549,
314
+ "creation_date": 1221636990,
315
+ "last_activity_date": 1221636990,
316
+ "up_vote_count": 3,
317
+ "down_vote_count": 0,
318
+ "view_count": 5384,
319
+ "score": 3,
320
+ "community_owned": false,
321
+ "title": "The Definitive Guide To Website Authentication (beta)"
322
+ },
323
+ {
324
+ "answer_id": 54510,
325
+ "accepted": false,
326
+ "answer_comments_url": "/answers/54510/comments",
327
+ "question_id": 549,
328
+ "owner": {
329
+ "user_id": 4534,
330
+ "user_type": "registered",
331
+ "display_name": "hendry",
332
+ "reputation": 588,
333
+ "email_hash": "29ab3f223a10c7b19916ea38141da74d"
334
+ },
335
+ "creation_date": 1221062271,
336
+ "last_activity_date": 1221062271,
337
+ "up_vote_count": 2,
338
+ "down_vote_count": 0,
339
+ "view_count": 5384,
340
+ "score": 2,
341
+ "community_owned": false,
342
+ "title": "The Definitive Guide To Website Authentication (beta)"
343
+ },
344
+ {
345
+ "answer_id": 50510,
346
+ "accepted": false,
347
+ "answer_comments_url": "/answers/50510/comments",
348
+ "question_id": 549,
349
+ "owner": {
350
+ "user_id": 3583,
351
+ "user_type": "registered",
352
+ "display_name": "Dmitry Shechtman",
353
+ "reputation": 656,
354
+ "email_hash": "3969f4d5c78f177c233b5335e7db29a7"
355
+ },
356
+ "creation_date": 1220903204,
357
+ "last_edit_date": 1220903743,
358
+ "last_activity_date": 1220903743,
359
+ "up_vote_count": 1,
360
+ "down_vote_count": 1,
361
+ "view_count": 5384,
362
+ "score": 0,
363
+ "community_owned": false,
364
+ "title": "The Definitive Guide To Website Authentication (beta)"
365
+ },
366
+ {
367
+ "answer_id": 49347,
368
+ "accepted": false,
369
+ "answer_comments_url": "/answers/49347/comments",
370
+ "question_id": 549,
371
+ "owner": {
372
+ "user_id": 5058,
373
+ "user_type": "registered",
374
+ "display_name": "Bobby Jack",
375
+ "reputation": 2130,
376
+ "email_hash": "9b5c260dc8b7374186b3bebc28b08ce7"
377
+ },
378
+ "creation_date": 1220865017,
379
+ "last_activity_date": 1220865017,
380
+ "up_vote_count": 3,
381
+ "down_vote_count": 3,
382
+ "view_count": 5384,
383
+ "score": 0,
384
+ "community_owned": false,
385
+ "title": "The Definitive Guide To Website Authentication (beta)"
386
+ },
387
+ {
388
+ "answer_id": 38933,
389
+ "accepted": false,
390
+ "answer_comments_url": "/answers/38933/comments",
391
+ "question_id": 549,
392
+ "owner": {
393
+ "user_id": 2976,
394
+ "user_type": "registered",
395
+ "display_name": "paan",
396
+ "reputation": 1636,
397
+ "email_hash": "f1f12dce3a058f3da675546821f1fff1"
398
+ },
399
+ "creation_date": 1220337424,
400
+ "last_activity_date": 1220337424,
401
+ "up_vote_count": 2,
402
+ "down_vote_count": 2,
403
+ "view_count": 5384,
404
+ "score": 0,
405
+ "community_owned": false,
406
+ "title": "The Definitive Guide To Website Authentication (beta)"
407
+ },
408
+ {
409
+ "answer_id": 37014,
410
+ "accepted": false,
411
+ "answer_comments_url": "/answers/37014/comments",
412
+ "question_id": 549,
413
+ "owner": {
414
+ "user_id": 2443,
415
+ "user_type": "registered",
416
+ "display_name": "Allain Lalonde",
417
+ "reputation": 10034,
418
+ "email_hash": "2076f150ee7934e4033b0ab7c1a9c73f"
419
+ },
420
+ "creation_date": 1220207249,
421
+ "last_activity_date": 1220207249,
422
+ "up_vote_count": 10,
423
+ "down_vote_count": 6,
424
+ "view_count": 5384,
425
+ "score": 4,
426
+ "community_owned": false,
427
+ "title": "The Definitive Guide To Website Authentication (beta)"
428
+ }
429
+ ]
430
+ }