pilha 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. data/lib/pilha.rb +18 -19
  2. data/lib/pilha/stack_overflow/answer.rb +0 -5
  3. data/lib/pilha/stack_overflow/badge.rb +1 -6
  4. data/lib/pilha/stack_overflow/base.rb +7 -4
  5. data/lib/pilha/stack_overflow/comment.rb +0 -5
  6. data/lib/pilha/stack_overflow/question.rb +20 -5
  7. data/lib/pilha/stack_overflow/statistics.rb +3 -10
  8. data/lib/pilha/stack_overflow/user.rb +0 -7
  9. data/pilha.gemspec +1 -1
  10. data/spec/fixtures/all_tags.json +287 -0
  11. data/spec/fixtures/all_tags.json.gz +0 -0
  12. data/spec/fixtures/favorite_questions_by_user_id.json +496 -0
  13. data/spec/fixtures/favorite_questions_by_user_id.json.gz +0 -0
  14. data/spec/fixtures/post_comments.json +6 -0
  15. data/spec/fixtures/questions_tagged_gwt_and_googleappengine.json +901 -0
  16. data/spec/fixtures/questions_tagged_gwt_and_googleappengine.json.gz +0 -0
  17. data/spec/fixtures/questions_tagged_ruby.json +877 -0
  18. data/spec/fixtures/questions_tagged_ruby.json.gz +0 -0
  19. data/spec/fixtures/questions_unanswered.json +845 -0
  20. data/spec/fixtures/questions_unanswered.json.gz +0 -0
  21. data/spec/fixtures/revisions_by_id.json +25 -0
  22. data/spec/fixtures/search_intitle_ruby.json +872 -0
  23. data/spec/fixtures/search_tagged_ruby_rails.json +877 -0
  24. data/spec/fixtures/tags_by_user_id.json +357 -0
  25. data/spec/fixtures/tags_by_user_id.json.gz +0 -0
  26. data/spec/fixtures/user_tags.json +357 -0
  27. data/spec/pilha/stack_overflow/badge_spec.rb +0 -4
  28. data/spec/pilha/stack_overflow/question_spec.rb +65 -0
  29. data/spec/pilha/stack_overflow/statistics_spec.rb +0 -4
  30. data/spec/spec_helper.rb +6 -0
  31. metadata +20 -3
data/lib/pilha.rb CHANGED
@@ -2,21 +2,22 @@ path = File.expand_path(File.dirname(__FILE__))
2
2
  $LOAD_PATH.unshift(path) unless $LOAD_PATH.include?(path)
3
3
 
4
4
  require 'rubygems'
5
+
5
6
  require 'zlib'
6
7
  require 'json'
7
8
  require 'open-uri'
8
9
  require 'forwardable'
9
10
 
10
11
  require 'pilha/stack_overflow/base'
11
- require 'pilha/stack_overflow/statistics'
12
- require 'pilha/stack_overflow/badge'
12
+ require 'pilha/stack_overflow/tag'
13
13
  require 'pilha/stack_overflow/user'
14
+ require 'pilha/stack_overflow/badge'
14
15
  require 'pilha/stack_overflow/answer'
15
16
  require 'pilha/stack_overflow/comment'
16
17
  require 'pilha/stack_overflow/question'
18
+ require 'pilha/stack_overflow/statistics'
17
19
 
18
20
  module StackExchange
19
-
20
21
  module StackOverflow
21
22
  class Client
22
23
  URL = 'http://api.stackoverflow.com/'
@@ -30,15 +31,15 @@ module StackExchange
30
31
  def config &block
31
32
  options = OpenStruct.new
32
33
  yield options if block_given?
33
-
34
- client = Client.new(options)
35
- include_client(client, Badge, Statistics, User, Answer, Comment, Question)
34
+ init_client! Client.new(options)
36
35
  end
37
36
 
38
- def include_client(client, *classes)
39
- classes.each do |klass|
40
- klass.instance_variable_set(:@client, client)
37
+ def init_client!(client)
38
+ base_eigenclass = class << Base; self; end
39
+ base_eigenclass.send :define_method, :client do
40
+ @client = client
41
41
  end
42
+ client
42
43
  end
43
44
  end
44
45
 
@@ -50,7 +51,7 @@ module StackExchange
50
51
 
51
52
  def api_method_path(pattern, options = {})
52
53
  pattern = normalize(pattern)
53
- parts = pattern.split('/').select { |part| part =~ /^:/ }
54
+ parts = pattern.split('/').select { |part| part =~ /^:/ }
54
55
 
55
56
  parts.each do |part|
56
57
  key = part.sub(':', '').intern
@@ -80,15 +81,13 @@ module StackExchange
80
81
 
81
82
  private
82
83
  def query_string(options)
83
- if params = options[:query]
84
- params = params.sort_by { |k, v| k.to_s }
85
-
86
- '?' + params.inject([]) do |arr, (key, value)|
87
- arr << "#{key}=#{value}"
88
- end.join('&')
89
- else
90
- ''
91
- end
84
+ params = options[:query] || options[:conditions]
85
+ return '' unless params
86
+
87
+ params = params.sort_by { |k, v| k.to_s }
88
+ pairs = params.map { |key, value| "#{key}=#{value}" }
89
+
90
+ '?' + pairs.join('&')
92
91
  end
93
92
 
94
93
  def normalize(url)
@@ -8,7 +8,6 @@ module StackExchange
8
8
  :view_count, :score, :community_owned, :title, :comments
9
9
 
10
10
  class << self
11
- attr_reader :client
12
11
 
13
12
  def find(id, options = {})
14
13
  request('/answers/:id', id, options).answers.first
@@ -32,10 +31,6 @@ module StackExchange
32
31
  end
33
32
  end
34
33
 
35
- def initialize(hash)
36
- @struct = OpenStruct.new hash
37
- end
38
-
39
34
  def id
40
35
  @struct.answer_id
41
36
  end
@@ -8,7 +8,6 @@ module StackExchange
8
8
  :award_count, :tag_based, :badges_recipients_url
9
9
 
10
10
  class << self
11
- attr_reader :client
12
11
 
13
12
  def all(options = {})
14
13
  method = select_method(options)
@@ -21,15 +20,11 @@ module StackExchange
21
20
  end
22
21
 
23
22
  def parse(response)
24
- response['badges'] = response['badges'].map { |badge| Badge.new badge }
23
+ parse_with_class(response, 'badges', Badge)
25
24
  OpenStruct.new response
26
25
  end
27
26
  end
28
27
 
29
- def initialize(hash)
30
- @struct = OpenStruct.new hash
31
- end
32
-
33
28
  def id
34
29
  @struct.badge_id
35
30
  end
@@ -3,6 +3,10 @@ module StackExchange
3
3
  class Base
4
4
 
5
5
  class << self
6
+ def client
7
+ @client ||= StackExchange::StackOverflow::Client.config
8
+ end
9
+
6
10
  def parse_with_class(hash, key, klass)
7
11
  case hash[key]
8
12
  when Hash
@@ -16,11 +20,10 @@ module StackExchange
16
20
  options.merge! :id => id if id
17
21
  parse client.request(path_pattern, options)
18
22
  end
23
+ end
19
24
 
20
- def client
21
- StackExchange::StackOverflow::Client.config unless @client
22
- @client
23
- end
25
+ def initialize(hash)
26
+ @struct = OpenStruct.new hash
24
27
  end
25
28
  end
26
29
  end
@@ -7,7 +7,6 @@ module StackExchange
7
7
  :post_type, :score, :body
8
8
 
9
9
  class << self
10
- attr_reader :client
11
10
 
12
11
  def find(id, options = {})
13
12
  request('/comments/:id/', id, options)
@@ -39,10 +38,6 @@ module StackExchange
39
38
  end
40
39
  end
41
40
 
42
- def initialize(hash)
43
- @struct = OpenStruct.new hash
44
- end
45
-
46
41
  def id
47
42
  @struct.comment_id
48
43
  end
@@ -10,7 +10,6 @@ module StackExchange
10
10
  :question_comments_url, :question_answers_url, :owner
11
11
 
12
12
  class << self
13
- attr_reader :client
14
13
 
15
14
  def find(id, options = {})
16
15
  request('/questions/:id/', id, options).questions.first
@@ -20,6 +19,26 @@ module StackExchange
20
19
  request('/users/:id/questions', id, options)
21
20
  end
22
21
 
22
+ def find_favorites_by_user_id(id, options = {})
23
+ request('/users/:id/favorites', id, options)
24
+ end
25
+
26
+ def find_by_tags(*tags)
27
+ if tags.last.is_a? Hash
28
+ options = tags.last
29
+ tags = tags[0, tags.size - 1]
30
+ else
31
+ options = {}
32
+ end
33
+
34
+ options.merge!(:conditions => { :tagged => tags.join('+') })
35
+ request('/questions', nil, options)
36
+ end
37
+
38
+ def unanswered(options = {})
39
+ request('/questions/unanswered', nil, options)
40
+ end
41
+
23
42
  def parse(response)
24
43
  response['questions'].each do |comment|
25
44
  parse_with_class(comment, 'owner', User)
@@ -29,10 +48,6 @@ module StackExchange
29
48
  end
30
49
  end
31
50
 
32
- def initialize(hash)
33
- @struct = OpenStruct.new hash
34
- end
35
-
36
51
  def id
37
52
  @struct.question_id
38
53
  end
@@ -9,21 +9,14 @@ module StackExchange
9
9
  :total_users, :questions_per_minute, :answers_per_minute,
10
10
  :badges_per_minute, :api_version
11
11
 
12
- def initialize(hash)
13
- @struct = OpenStruct.new hash
14
- end
15
-
16
12
  class << self
17
- attr_reader :client
18
-
19
13
  def all(options = {})
20
14
  request('/stats', nil, options)
21
15
  end
22
16
 
23
- private
24
- def parse(response)
25
- Statistics.new response['statistics'].first
26
- end
17
+ def parse(response)
18
+ Statistics.new response['statistics'].first
19
+ end
27
20
  end
28
21
  end
29
22
  end
@@ -13,9 +13,6 @@ module StackExchange
13
13
  :badge_counts
14
14
 
15
15
  class << self
16
-
17
- attr_reader :client
18
-
19
16
  def all(options = {})
20
17
  request('/users', nil, options)
21
18
  end
@@ -34,10 +31,6 @@ module StackExchange
34
31
  end
35
32
  end
36
33
 
37
- def initialize(hash)
38
- @struct = OpenStruct.new hash
39
- end
40
-
41
34
  def id
42
35
  @struct.user_id
43
36
  end
data/pilha.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |gem|
2
2
  gem.name = "pilha"
3
- gem.version = "0.1.6"
3
+ gem.version = "0.1.7"
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."
@@ -0,0 +1,287 @@
1
+ {
2
+ "total": 29199,
3
+ "page": 1,
4
+ "pagesize": 70,
5
+ "tags": [
6
+ {
7
+ "name": "c#",
8
+ "count": 84875
9
+ },
10
+ {
11
+ "name": "java",
12
+ "count": 50661
13
+ },
14
+ {
15
+ "name": ".net",
16
+ "count": 42982
17
+ },
18
+ {
19
+ "name": "php",
20
+ "count": 42359
21
+ },
22
+ {
23
+ "name": "asp.net",
24
+ "count": 38560
25
+ },
26
+ {
27
+ "name": "javascript",
28
+ "count": 37024
29
+ },
30
+ {
31
+ "name": "c++",
32
+ "count": 31709
33
+ },
34
+ {
35
+ "name": "jquery",
36
+ "count": 29607
37
+ },
38
+ {
39
+ "name": "iphone",
40
+ "count": 26442
41
+ },
42
+ {
43
+ "name": "python",
44
+ "count": 25583
45
+ },
46
+ {
47
+ "name": "sql",
48
+ "count": 20885
49
+ },
50
+ {
51
+ "name": "mysql",
52
+ "count": 18581
53
+ },
54
+ {
55
+ "name": "html",
56
+ "count": 17460
57
+ },
58
+ {
59
+ "name": "sql-server",
60
+ "count": 15911
61
+ },
62
+ {
63
+ "name": "ruby-on-rails",
64
+ "count": 14369
65
+ },
66
+ {
67
+ "name": "c",
68
+ "count": 13986
69
+ },
70
+ {
71
+ "name": "asp.net-mvc",
72
+ "count": 13154
73
+ },
74
+ {
75
+ "name": "css",
76
+ "count": 13126
77
+ },
78
+ {
79
+ "name": "wpf",
80
+ "count": 13074
81
+ },
82
+ {
83
+ "name": "objective-c",
84
+ "count": 12652
85
+ },
86
+ {
87
+ "name": "windows",
88
+ "count": 10966
89
+ },
90
+ {
91
+ "name": "xml",
92
+ "count": 10172
93
+ },
94
+ {
95
+ "name": "ruby",
96
+ "count": 10157
97
+ },
98
+ {
99
+ "name": "database",
100
+ "count": 9314
101
+ },
102
+ {
103
+ "name": "best-practices",
104
+ "count": 9280
105
+ },
106
+ {
107
+ "name": "android",
108
+ "count": 9129
109
+ },
110
+ {
111
+ "name": "vb.net",
112
+ "count": 8826
113
+ },
114
+ {
115
+ "name": "visual-studio",
116
+ "count": 8564
117
+ },
118
+ {
119
+ "name": "ajax",
120
+ "count": 8168
121
+ },
122
+ {
123
+ "name": "winforms",
124
+ "count": 8154
125
+ },
126
+ {
127
+ "name": "regex",
128
+ "count": 8120
129
+ },
130
+ {
131
+ "name": "linux",
132
+ "count": 8031
133
+ },
134
+ {
135
+ "name": "django",
136
+ "count": 7724
137
+ },
138
+ {
139
+ "name": "iphone-sdk",
140
+ "count": 7322
141
+ },
142
+ {
143
+ "name": "visual-studio-2008",
144
+ "count": 6996
145
+ },
146
+ {
147
+ "name": "beginner",
148
+ "count": 6687
149
+ },
150
+ {
151
+ "name": "web-development",
152
+ "count": 6485
153
+ },
154
+ {
155
+ "name": "flex",
156
+ "count": 6404
157
+ },
158
+ {
159
+ "name": "subjective",
160
+ "count": 6229
161
+ },
162
+ {
163
+ "name": "flash",
164
+ "count": 6086
165
+ },
166
+ {
167
+ "name": "linq",
168
+ "count": 5998
169
+ },
170
+ {
171
+ "name": "wcf",
172
+ "count": 5865
173
+ },
174
+ {
175
+ "name": "silverlight",
176
+ "count": 5761
177
+ },
178
+ {
179
+ "name": "cocoa",
180
+ "count": 5659
181
+ },
182
+ {
183
+ "name": "actionscript-3",
184
+ "count": 5359
185
+ },
186
+ {
187
+ "name": "sql-server-2005",
188
+ "count": 5329
189
+ },
190
+ {
191
+ "name": "cocoa-touch",
192
+ "count": 5257
193
+ },
194
+ {
195
+ "name": "performance",
196
+ "count": 5236
197
+ },
198
+ {
199
+ "name": "algorithm",
200
+ "count": 5142
201
+ },
202
+ {
203
+ "name": "perl",
204
+ "count": 5081
205
+ },
206
+ {
207
+ "name": "eclipse",
208
+ "count": 5072
209
+ },
210
+ {
211
+ "name": "oracle",
212
+ "count": 5045
213
+ },
214
+ {
215
+ "name": "web-services",
216
+ "count": 4859
217
+ },
218
+ {
219
+ "name": "security",
220
+ "count": 4848
221
+ },
222
+ {
223
+ "name": "svn",
224
+ "count": 4837
225
+ },
226
+ {
227
+ "name": "delphi",
228
+ "count": 4778
229
+ },
230
+ {
231
+ "name": "multithreading",
232
+ "count": 4762
233
+ },
234
+ {
235
+ "name": "sharepoint",
236
+ "count": 4760
237
+ },
238
+ {
239
+ "name": "arrays",
240
+ "count": 4395
241
+ },
242
+ {
243
+ "name": "unit-testing",
244
+ "count": 4292
245
+ },
246
+ {
247
+ "name": "nhibernate",
248
+ "count": 4216
249
+ },
250
+ {
251
+ "name": "linq-to-sql",
252
+ "count": 4171
253
+ },
254
+ {
255
+ "name": "tsql",
256
+ "count": 4031
257
+ },
258
+ {
259
+ "name": "apache",
260
+ "count": 3882
261
+ },
262
+ {
263
+ "name": "string",
264
+ "count": 3790
265
+ },
266
+ {
267
+ "name": "homework",
268
+ "count": 3664
269
+ },
270
+ {
271
+ "name": "excel",
272
+ "count": 3629
273
+ },
274
+ {
275
+ "name": "design",
276
+ "count": 3506
277
+ },
278
+ {
279
+ "name": "xcode",
280
+ "count": 3472
281
+ },
282
+ {
283
+ "name": "mvc",
284
+ "count": 3427
285
+ }
286
+ ]
287
+ }