lunker 0.0.4

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.
@@ -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: []