kickstarter 0.0.2
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.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README +41 -0
- data/Rakefile +1 -0
- data/kickstarter.gemspec +23 -0
- data/lib/kickstarter.rb +72 -0
- data/lib/kickstarter/project.rb +93 -0
- data/lib/kickstarter/version.rb +3 -0
- metadata +77 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
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'
|
data/kickstarter.gemspec
ADDED
@@ -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
|
data/lib/kickstarter.rb
ADDED
@@ -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
|
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: []
|