lunker 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,37 @@
1
+ require 'pp'
2
+
3
+ module Lunker
4
+ module PagedResource
5
+ def get_paged_resource(url, limit=nil)
6
+ res = HTTParty.get url
7
+
8
+ raise 'bad get request' unless valid?(res)
9
+
10
+ data = []
11
+ page = 1
12
+
13
+ data = data.concat res['items']
14
+ while res['has_more']
15
+
16
+ res = HTTParty.get "#{url}&page=#{page}"
17
+
18
+ if valid?(res)
19
+ page += 1
20
+ data = data.concat res['items']
21
+ end
22
+
23
+ if limit && data.length > limit
24
+ break
25
+ end
26
+ end
27
+
28
+ Lunker.requests_remaining = res['quota_remaining']
29
+
30
+ data
31
+ end
32
+
33
+ def valid?(response)
34
+ response.kind_of?(Hash) && !response.has_key?('error')
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,8 @@
1
+ require 'net/http'
2
+ module Lunker
3
+ module Utils
4
+ def parameterize(hash)
5
+ URI.escape(hash.collect { |k, v| "#{k}=#{v}"}.join("&"))
6
+ end
7
+ end
8
+ end
data/lib/lunker.rb ADDED
@@ -0,0 +1,69 @@
1
+ require 'httparty'
2
+ require 'lunker/paged_resource'
3
+ require 'lunker/utils'
4
+
5
+
6
+ module Lunker
7
+ SO_URL = 'http://api.stackexchange.com/2.0'
8
+
9
+ class << self
10
+ attr_accessor :configuration, :requests_remaining
11
+ end
12
+
13
+ def self.configure
14
+ self.configuration ||= Configuration.new
15
+ self.requests_remaining = 10000
16
+ yield(configuration) if block_given?
17
+ end
18
+
19
+ class Configuration
20
+ attr_accessor :api_key, :filter
21
+
22
+ def initialize
23
+ @api_key = "bb855F7mbVFTS9Jwe69THg(("
24
+ # Default filter: we want the titles and bodies of questions, answers, comments
25
+ @filter = "!T5FUCxHumN2QdgS1Nc"
26
+ end
27
+ end
28
+
29
+ class StackOverflow
30
+ include Lunker::PagedResource
31
+ include Lunker::Utils
32
+
33
+ def initialize
34
+ end
35
+
36
+ def users(size_limit, parameters={:sort=>'reputation',:order =>'desc',:min =>'100000'})
37
+ parameters = {
38
+ :pagesize => "100",
39
+ :key => Lunker.configuration.api_key,
40
+ :site => "stackoverflow",
41
+ :filter => Lunker.configuration.filter
42
+ }.merge(parameters)
43
+ encoded_parameters = parameterize parameters
44
+
45
+ get_paged_resource "#{SO_URL}/users?#{encoded_parameters}", size_limit
46
+ end
47
+ end
48
+
49
+ class User
50
+ include Lunker::PagedResource
51
+ def initialize(id)
52
+ @id = id
53
+ end
54
+
55
+ %w(answers questions comments).each do |meth|
56
+ define_method(meth) do |*sort|
57
+ url = "#{SO_URL}/users/#{@id}/#{meth}?pagesize=100&key=#{Lunker.configuration.api_key}&site=stackoverflow&filter=#{Lunker.configuration.filter}"
58
+ # Horribleness to allo an optional sort parameter
59
+ unless sort.empty?
60
+ url = "#{url}&sort=#{sort[0]}"
61
+ end
62
+ get_paged_resource url
63
+ end
64
+ end
65
+ end
66
+ end
67
+
68
+ # Set up defaults
69
+ Lunker.configure
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lunker
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.4
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jamison Dance
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-02-29 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: httparty
16
+ requirement: &70317175589580 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70317175589580
25
+ description: See the summary.
26
+ email: jergason@gmail.com
27
+ executables: []
28
+ extensions: []
29
+ extra_rdoc_files: []
30
+ files:
31
+ - lib/lunker.rb
32
+ - lib/lunker/paged_resource.rb
33
+ - lib/lunker/utils.rb
34
+ homepage: https://github.com/jergason/lunker.git
35
+ licenses: []
36
+ post_install_message:
37
+ rdoc_options: []
38
+ require_paths:
39
+ - lib
40
+ required_ruby_version: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '1.9'
46
+ required_rubygems_version: !ruby/object:Gem::Requirement
47
+ none: false
48
+ requirements:
49
+ - - ! '>='
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ requirements: []
53
+ rubyforge_project:
54
+ rubygems_version: 1.8.17
55
+ signing_key:
56
+ specification_version: 3
57
+ summary: A wrapper for the StackExchange API.
58
+ test_files: []