kickstarter 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in kickstarter.gemspec
4
+ gemspec
data/README ADDED
@@ -0,0 +1,41 @@
1
+ Kickstart
2
+ a simple API for Kickstarter.com
3
+
4
+ Usage:
5
+
6
+ kickstarter = Kickstarter::Base.new(settings)
7
+
8
+ projects = kickstarter.by_category(:games, :page => 1)
9
+ # => returns back an array of projects from page 1
10
+
11
+ projects = kickstarter.by_list(:ending_soon, :page => 2, :pages => 3)
12
+ # => returns back an array of 3 pages worth of projects, starting from page 2
13
+
14
+
15
+ A Kickstart::Project has the following attributes:
16
+ .name
17
+ .handle
18
+ .description
19
+ .url
20
+ .owner
21
+ .email
22
+ .thumbnail_url
23
+ .pledge_amount
24
+ .pledge_precent
25
+ .pledge_deadline
26
+
27
+ and methods:
28
+ (future)
29
+ .details => get more details from about the project, from the Project details page
30
+
31
+ Options:
32
+
33
+ :page => X # which page number of results to return. May be empty
34
+ :pages => Y # number of pages worth of results. Don't be stupid and request too many pages...
35
+
36
+
37
+ future:
38
+ * support filter by pledge_amount
39
+
40
+
41
+
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "kickstarter/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "kickstarter"
7
+ s.version = Kickstarter::VERSION
8
+ s.authors = ["John Tajima"]
9
+ s.email = ["manjiro@gmail.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{A simple wrapper for Kickstarter.com}
12
+ s.description = %q{A simple wrapper for kickstarter.com}
13
+
14
+ s.rubyforge_project = "kickstarter"
15
+
16
+ s.add_dependency "nokogiri"
17
+ s.add_development_dependency "fakeweb"
18
+
19
+ s.files = `git ls-files`.split("\n")
20
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
21
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
22
+ s.require_paths = ["lib"]
23
+ end
@@ -0,0 +1,72 @@
1
+ require 'rubygems'
2
+ require "nokogiri"
3
+ require 'open-uri'
4
+ require 'date'
5
+ require "kickstarter/version"
6
+ require "kickstarter/project"
7
+
8
+ module Kickstarter
9
+ BASE_URL = "http://kickstarter.com"
10
+
11
+ Categories = {
12
+ :comics => "Comics",
13
+ :dance => "Dance",
14
+ :design => "Design",
15
+ :fashion => "Fashion",
16
+ :film_video => "Film & Video",
17
+ :fine_art => "Fine Art",
18
+ :food => "Food",
19
+ :games => "Games",
20
+ :music => "Music",
21
+ :photography => "Photography",
22
+ :technology => "Technology",
23
+ :theatre => "Theater",
24
+ :writing => "Writing & Publishing"
25
+ }
26
+
27
+ Type = {
28
+ :recommended => 'recommended',
29
+ :popular => 'popular',
30
+ :successful => 'successful'
31
+ }
32
+
33
+ Lists = {
34
+ :recommended => "recommended",
35
+ :popular => "popular",
36
+ :recently_launched => "recently-launched",
37
+ :ending_soon => "ending-soon",
38
+ :small_projects => "small-projects",
39
+ :most_funded => "most-funded",
40
+ :curated => "curated-pages",
41
+ }
42
+
43
+ # by category
44
+ # /discover/categories/:category/:subcategories
45
+ # :type # => [recommended, popular, successful]
46
+ def self.by_category(category, options = {})
47
+ path = File.join(BASE_URL, 'discover/categories', Categories[category.to_sym], Type[options[:type] || :popular])
48
+ list_projects(path, options)
49
+ end
50
+
51
+ # by lists
52
+ # /discover/:list
53
+ def self.by_list(list, options = {})
54
+ path = File.join(BASE_URL, 'discover', Lists[list.to_sym])
55
+ list_projects(path, options)
56
+ end
57
+
58
+ private
59
+
60
+ def self.list_projects(url, options = {})
61
+ start_page = options.fetch(:page, 1)
62
+ end_page = start_page + options.fetch(:pages, 0)
63
+
64
+ results = (start_page..end_page).map do |page|
65
+ doc = Nokogiri::HTML(open(url))
66
+ doc.css('.project').map do |node|
67
+ project = Kickstarter::Project.new(node)
68
+ end
69
+ end
70
+ results.flatten
71
+ end
72
+ end
@@ -0,0 +1,93 @@
1
+ module Kickstarter
2
+
3
+ class Project
4
+
5
+ attr_reader :node
6
+
7
+ def initialize(node)
8
+ @node = node
9
+ end
10
+
11
+ def handle
12
+ @handle ||= url.split('/projects/').last
13
+ end
14
+
15
+ def name
16
+ @name ||= link.inner_html
17
+ end
18
+
19
+ def description
20
+ @description ||= node.css('h2 + p').inner_html
21
+ end
22
+
23
+ def url
24
+ @url ||= File.join(Kickstarter::BASE_URL, link.attribute('href').to_s.split('?').first)
25
+ end
26
+
27
+
28
+ def owner
29
+ @owner ||= node.css('h2 span').first.inner_html.gsub(/by/, "").strip
30
+ end
31
+
32
+ def email
33
+ end
34
+
35
+ def thumbnail_url
36
+ @thumbnail_url ||= node.css('.project-thumbnail img').first.attribute('src').to_s
37
+ end
38
+
39
+ def pledge_amount
40
+ @pledge_amount ||= node.css('.project-stats li')[1].css('strong').inner_html.gsub(/[^\d]/,'').to_i
41
+ end
42
+
43
+ def pledge_percent
44
+ @pledge_percent ||= node.css('.project-stats li strong').inner_html.to_i
45
+ end
46
+
47
+
48
+
49
+ # # can be X days|hours left
50
+ # or <strong>FUNDED</strong> Aug 12, 2011
51
+ def pledge_deadline
52
+ @pledge_deadline ||= begin
53
+ date = node.css('.project-stats li').last.inner_html.to_s
54
+ puts "parsing date #{date}"
55
+ if date =~ /Funded/
56
+ Date.parse date.split('<strong>Funded</strong>').last.strip
57
+ elsif date =~ /hours left/
58
+ future = Time.now + date.match(/\d+/)[0].to_i * 60*60
59
+ Date.parse(future.to_s)
60
+ elsif date =~ /days left/
61
+ Date.parse(Time.now.to_s) + date.match(/\d+/)[0].to_i
62
+ end
63
+ end
64
+ end
65
+
66
+
67
+ def to_hash
68
+ {
69
+ :name => name,
70
+ :handle => handle,
71
+ :url => url,
72
+ :description => description,
73
+ :owner => owner,
74
+ :pledge_amount => pledge_amount,
75
+ :pledge_percent => pledge_percent,
76
+ :pledge_deadline => pledge_deadline,
77
+ :thumbnail_url => thumbnail_url
78
+ }
79
+ end
80
+
81
+ def inspect
82
+ to_hash.inspect
83
+ end
84
+
85
+ private
86
+
87
+ def link
88
+ node.css('h2 a').first
89
+ end
90
+
91
+ end
92
+
93
+ end
@@ -0,0 +1,3 @@
1
+ module Kickstarter
2
+ VERSION = "0.0.2"
3
+ end
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kickstarter
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - John Tajima
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-08-15 00:00:00.000000000 -04:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: nokogiri
17
+ requirement: &70288051444740 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *70288051444740
26
+ - !ruby/object:Gem::Dependency
27
+ name: fakeweb
28
+ requirement: &70288051444320 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: *70288051444320
37
+ description: A simple wrapper for kickstarter.com
38
+ email:
39
+ - manjiro@gmail.com
40
+ executables: []
41
+ extensions: []
42
+ extra_rdoc_files: []
43
+ files:
44
+ - .gitignore
45
+ - Gemfile
46
+ - README
47
+ - Rakefile
48
+ - kickstarter.gemspec
49
+ - lib/kickstarter.rb
50
+ - lib/kickstarter/project.rb
51
+ - lib/kickstarter/version.rb
52
+ has_rdoc: true
53
+ homepage: ''
54
+ licenses: []
55
+ post_install_message:
56
+ rdoc_options: []
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ! '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ required_rubygems_version: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ requirements: []
72
+ rubyforge_project: kickstarter
73
+ rubygems_version: 1.6.2
74
+ signing_key:
75
+ specification_version: 3
76
+ summary: A simple wrapper for Kickstarter.com
77
+ test_files: []