pilha 0.1.5 → 0.1.6

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.
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
+ }