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