crunchbase-ruby-library 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. data/.gitignore +24 -0
  2. data/.rspec +2 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +102 -0
  6. data/Rakefile +2 -0
  7. data/crunchbase-ruby-library.gemspec +25 -0
  8. data/lib/crunchbase.rb +12 -0
  9. data/lib/crunchbase/api.rb +160 -0
  10. data/lib/crunchbase/exception.rb +18 -0
  11. data/lib/crunchbase/model.rb +49 -0
  12. data/lib/crunchbase/model/acquired_by.rb +7 -0
  13. data/lib/crunchbase/model/acquisition.rb +36 -0
  14. data/lib/crunchbase/model/address.rb +20 -0
  15. data/lib/crunchbase/model/advisory_role.rb +10 -0
  16. data/lib/crunchbase/model/board_members_and_advisor.rb +25 -0
  17. data/lib/crunchbase/model/category.rb +17 -0
  18. data/lib/crunchbase/model/competitor.rb +7 -0
  19. data/lib/crunchbase/model/current_team.rb +25 -0
  20. data/lib/crunchbase/model/customer.rb +7 -0
  21. data/lib/crunchbase/model/degree.rb +31 -0
  22. data/lib/crunchbase/model/entity.rb +134 -0
  23. data/lib/crunchbase/model/error.rb +14 -0
  24. data/lib/crunchbase/model/founded_company.rb +27 -0
  25. data/lib/crunchbase/model/founder.rb +9 -0
  26. data/lib/crunchbase/model/fund.rb +26 -0
  27. data/lib/crunchbase/model/funding_round.rb +58 -0
  28. data/lib/crunchbase/model/headquarter.rb +6 -0
  29. data/lib/crunchbase/model/image.rb +17 -0
  30. data/lib/crunchbase/model/investment.rb +27 -0
  31. data/lib/crunchbase/model/investor.rb +28 -0
  32. data/lib/crunchbase/model/ipo.rb +35 -0
  33. data/lib/crunchbase/model/job.rb +39 -0
  34. data/lib/crunchbase/model/location.rb +29 -0
  35. data/lib/crunchbase/model/member.rb +7 -0
  36. data/lib/crunchbase/model/membership.rb +28 -0
  37. data/lib/crunchbase/model/new.rb +21 -0
  38. data/lib/crunchbase/model/office.rb +9 -0
  39. data/lib/crunchbase/model/organization.rb +88 -0
  40. data/lib/crunchbase/model/organization_summary.rb +19 -0
  41. data/lib/crunchbase/model/owned_by.rb +27 -0
  42. data/lib/crunchbase/model/parent_location.rb +7 -0
  43. data/lib/crunchbase/model/past_team.rb +25 -0
  44. data/lib/crunchbase/model/person.rb +55 -0
  45. data/lib/crunchbase/model/person_summary.rb +23 -0
  46. data/lib/crunchbase/model/primary_affiliation.rb +22 -0
  47. data/lib/crunchbase/model/primary_image.rb +7 -0
  48. data/lib/crunchbase/model/primary_location.rb +17 -0
  49. data/lib/crunchbase/model/product.rb +47 -0
  50. data/lib/crunchbase/model/school.rb +6 -0
  51. data/lib/crunchbase/model/search.rb +50 -0
  52. data/lib/crunchbase/model/search_result.rb +10 -0
  53. data/lib/crunchbase/model/sub_organization.rb +9 -0
  54. data/lib/crunchbase/model/video.rb +17 -0
  55. data/lib/crunchbase/model/website.rb +17 -0
  56. data/lib/crunchbase/version.rb +3 -0
  57. data/spec/crunchbase.yml.example +2 -0
  58. data/spec/crunchbase/model/board_members_and_advisor_spec.rb +20 -0
  59. data/spec/crunchbase/model/office_spec.rb +17 -0
  60. data/spec/crunchbase/model/organization_spec.rb +60 -0
  61. data/spec/crunchbase/model/past_team_spec.rb +26 -0
  62. data/spec/crunchbase/model/person_spec.rb +28 -0
  63. data/spec/crunchbase/model/product_spec.rb +33 -0
  64. data/spec/crunchbase/model/search_spec.rb +50 -0
  65. data/spec/crunchbase/model/website_spec.rb +18 -0
  66. data/spec/spec_helper.rb +20 -0
  67. metadata +192 -0
@@ -0,0 +1,24 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
23
+
24
+ spec/crunchbase.yml
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in crunchbase-ruby-library.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Encore Shao
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,102 @@
1
+ # Crunchbase
2
+
3
+ Crunchbase API Version 3 - Ruby Library [CrunchBase Data Hub](http://data.crunchbase.com/v3).
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'crunchbase-ruby-library'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install crunchbase-ruby-library
18
+
19
+ ## Usage Examples
20
+
21
+ Config your user_key, debug somewhere like development.rb, Recommended directory config/initializers/crunchbase.rb
22
+
23
+ require 'crunchbase'
24
+
25
+ Crunchbase::API.key = 'user_key'
26
+ Crunchbase::API.debug = false
27
+
28
+ ## Search Organization OR Person
29
+
30
+ Retrieve the way, Please use Search Class. The Search Will Return a list consisting of objects of the OrganizationSummary | PersonSummary type. Example:
31
+
32
+ Query Orgnization
33
+
34
+ Method 1
35
+ response = Crunchbase::Model::Search.search({query: "Google"}, 'organizations')
36
+
37
+ Method 2
38
+ response = Crunchbase::Model::Search.search({name: "Google"}, 'organizations')
39
+
40
+ Method 3
41
+ response = Crunchbase::Model::Search.search({domain_name: "google.com"}, 'organizations')
42
+
43
+ response.total_items || response.per_page || response.pages || response.current_page
44
+ response.results.each { |r| puts r.name }
45
+
46
+
47
+ Query Person
48
+
49
+ response = Crunchbase::Model::Search.search({query: "encore"}, 'people')
50
+
51
+ response.results.each { |i| [i.first_name, i.last_name] }
52
+
53
+ ## Get Organization && RelationShips
54
+
55
+ Get information by the permalink, Example:
56
+
57
+ response = Crunchbase::Model::Organization.get("facebook")
58
+
59
+ Relationship objects [ primary_image founders current_team investors owned_by sub_organizations headquarters offices products categories customers competitors members memberships funding_rounds investments acquisitions acquired_by ipo funds websites images videos news ]
60
+
61
+ response.founders
62
+ response.competitors_total_items
63
+ response.websites
64
+
65
+ NOTE: If you want all `past_team` `board_members_and_advisors` items, Please do:
66
+
67
+ # Methods
68
+
69
+ past_team = Crunchbase::Model::PastTeam.organization_lists("facebook")
70
+ past_team.results.collect { |p| [p.title, p.person.first_name] }
71
+
72
+ ....
73
+
74
+ ## Person
75
+
76
+ Get information by the permalink, Example:
77
+
78
+ person = Crunchbase::Model::Person.get( permalink )
79
+
80
+ #<Crunchbase::Model::Person:0x007fc185215f68 @type_name="Person", @uuid="a578dcf9859ec8b52182e3aa3c383b13", ...>
81
+
82
+ people = Crunchbase::Model::Person.list( page )
83
+
84
+ people.results
85
+
86
+ [ #<Crunchbase::Model::PersonSummary:...>,
87
+ #<Crunchbase::Model::PersonSummary: ...>,
88
+ #<Crunchbase::Model::PersonSummary: ...>,
89
+ #<Crunchbase::Model::PersonSummary: ...>
90
+ ...... ]
91
+
92
+ ## Contributing
93
+
94
+ 1. Fork it ( https://github.com/encoreshao/crunchbase-ruby-library/fork )
95
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
96
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
97
+ 4. Push to the branch (`git push origin my-new-feature`)
98
+ 5. Create a new Pull Request
99
+
100
+ ## Copyright
101
+
102
+ Copyright © 2015-05 Encore Shao. See LICENSE for details.
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'crunchbase/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "crunchbase-ruby-library"
8
+ spec.version = Crunchbase::VERSION
9
+ spec.authors = ["Encore Shao"]
10
+ spec.email = ["encore.shao@gmail.com"]
11
+ spec.summary = %q{ Ruby wrapper for Crunchbase API version 3 }
12
+ spec.description = %q{ Ruby wrapper for Crunchbase API version 3 }
13
+ spec.homepage = "https://github.com/encoreshao/crunchbase-ruby-library"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.6"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec", "~> 3.0"
24
+ spec.add_development_dependency "rspec-its"
25
+ end
@@ -0,0 +1,12 @@
1
+ require 'singleton'
2
+ require 'time'
3
+
4
+ require "crunchbase/version"
5
+ require 'crunchbase/api'
6
+ require 'crunchbase/model'
7
+ require "crunchbase/exception"
8
+
9
+ module Crunchbase
10
+ class << self
11
+ end
12
+ end
@@ -0,0 +1,160 @@
1
+ # encoding: utf-8
2
+
3
+ require 'net/http'
4
+
5
+ begin
6
+ require 'yajl'
7
+ rescue LoadError
8
+ require 'json'
9
+ end
10
+
11
+ require 'timeout'
12
+
13
+ module Crunchbase
14
+ class API
15
+
16
+ SUPPORTED_ENTITIES = ['organizations', 'people', 'products', 'funding_rounds', 'acquisitions', 'ipos', 'locations', 'categories', 'offices', 'customers', 'degrees', 'experience', 'primary_affiliation', 'videos', 'founded_companies', 'primary_location', 'advisor_at']
17
+
18
+ @timeout_limit = 60
19
+ @redirect_limit = 2
20
+ @version = '3'
21
+ @base_url = 'https://api.crunchbase.com'
22
+ @site_url = "https://www.crunchbase.com"
23
+ @image_url = "https://res.cloudinary.com/crunchbase-production/"
24
+ @debug = false
25
+
26
+ # Must be overridden in subclasses
27
+ RESOURCE_NAME = "undefined"
28
+ RESOURCE_LIST = "undefineds"
29
+
30
+ ORDER_CREATED_AT_ASC = 'created_at asc'
31
+ ORDER_CREATED_AT_DESC = 'created_at desc'
32
+ ORDER_UPDATED_AT_ASC = 'updated_at asc'
33
+ ORDER_UPDATED_AT_DESC = 'updated_at desc'
34
+
35
+ class << self
36
+ attr_accessor :timeout_limit, :redirect_limit, :key, :base_url, :version, :debug, :image_url, :site_url
37
+
38
+ def api_url
39
+ base_url.gsub(/\/$/, '') + '/v/' + version + '/'
40
+ end
41
+ end
42
+
43
+ def self.single_entity(permalink, entity_name)
44
+ raise CrunchException, "Unsupported Entity Type" unless SUPPORTED_ENTITIES.include?(entity_name)
45
+
46
+ fetch(permalink, entity_name)
47
+ end
48
+
49
+ private
50
+
51
+ # Returns the JSON parser, whether that's an instance of Yajl or JSON
52
+ def self.parser
53
+ if defined?(Yajl)
54
+ Yajl::Parser
55
+ else
56
+ JSON
57
+ end
58
+ end
59
+
60
+ # Fetches URI for the permalink interface.
61
+ def self.fetch(permalink, object_name)
62
+ get_json_response( api_url + "#{object_name}/#{permalink}" )
63
+ end
64
+
65
+ # Fetches URI for the search interface.
66
+ def self.search(options, resource_list)
67
+ options[:page] = 1 if options[:page].nil?
68
+ options[:order] = ORDER_CREATED_AT_ASC if options[:order].nil?
69
+
70
+ uri = api_url + "#{resource_list}?" + collect_parameters(options)
71
+
72
+ get_json_response(uri)
73
+ end
74
+
75
+
76
+ # Fetches URI for the search interface.
77
+ def self.list(options, resource_list)
78
+ options[:page] = 1 if options[:page].nil?
79
+ model_name = options.delete(:model_name)
80
+
81
+ uri = api_url + "#{resource_list}?" + collect_parameters(options)
82
+
83
+ Crunchbase::Model::Search.new options, get_json_response(uri), model_name
84
+ end
85
+
86
+ def self.collect_parameters(options)
87
+ require "cgi"
88
+
89
+ options.map{|k,v| "#{CGI.escape(k.to_s)}=#{CGI.escape(v.to_s)}"}.join('&')
90
+ end
91
+
92
+ def self.organization_lists(permalink, category, options)
93
+ lists_for_category('organizations', permalink, category, options)
94
+ end
95
+
96
+ # Demo: https://api.crunchbase.com/v/#{version}/person/#{person-permalink}/offices?user_key=key
97
+ def self.person_lists(permalink, category, options)
98
+ lists_for_category('people', permalink, category, options)
99
+ end
100
+
101
+ def self.lists_for_category(classify_name, permalink, category, options)
102
+ options[:page] = 1 if options[:page].nil?
103
+ options[:order] = ORDER_CREATED_AT_ASC if options[:order].nil?
104
+ model_name = options.delete(:model_name)
105
+
106
+ uri = api_url + "#{classify_name}/#{permalink}/#{category}?#{collect_parameters(options)}"
107
+
108
+ Crunchbase::Model::Search.new options, get_json_response(uri), model_name
109
+ end
110
+
111
+ # Gets specified URI, then parses the returned JSON. Raises Timeout error
112
+ # if request time exceeds set limit. Raises Crunchbase::Exception if returned
113
+ # JSON contains an error.
114
+ def self.get_json_response(uri)
115
+ raise Crunchbase::Exception, "User key required, visit http://data.crunchbase.com" unless @key
116
+ uri = uri + "#{uri.match('\?') ? "&" : "?"}user_key=#{@key}"
117
+
118
+ resp = Timeout::timeout(@timeout_limit) {
119
+ get_url_following_redirects(uri, @redirect_limit)
120
+ }
121
+ response = parser.parse(resp)["data"]
122
+
123
+ raise Crunchbase::Exception, response["error"] if response.class == Hash && response["error"] && response["error"]["code"] != 500
124
+
125
+ response
126
+ end
127
+
128
+ # Performs actual HTTP requests, recursively if a redirect response is
129
+ # encountered. Will raise HTTP error if response is not 200, 404, or 3xx.
130
+ def self.get_url_following_redirects(uri_str, limit = 10)
131
+ raise Crunchbase::Exception, 'HTTP redirect too deep' if limit == 0
132
+
133
+ uri = URI.parse(uri_str)
134
+
135
+ debug_log!(uri) if debug
136
+
137
+ http = Net::HTTP.new(uri.host, uri.port)
138
+ http.use_ssl = true if uri.scheme == 'https'
139
+ response = http.start do |h|
140
+ h.request Net::HTTP::Get.new(uri.request_uri)
141
+ end
142
+
143
+ case response
144
+ when Net::HTTPSuccess, Net::HTTPNotFound, Net::HTTPInternalServerError
145
+ response.body
146
+ when Net::HTTPRedirection
147
+ get_url_following_redirects(response['location'], limit - 1)
148
+ else
149
+ response.error!
150
+ end
151
+ end
152
+
153
+ def self.debug_log!(uri)
154
+ puts "*"*120
155
+ puts "*** #{uri} ***"
156
+ puts "*"*120
157
+ end
158
+
159
+ end
160
+ end
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ module Crunchbase
4
+ class Exception < ::Exception
5
+ end
6
+
7
+ class ConfigurationException < Exception
8
+ end
9
+
10
+ class MissingParamsException < Exception
11
+ end
12
+
13
+ class InvalidRequestException < Exception
14
+ end
15
+
16
+ class ResponseTypeException < Exception
17
+ end
18
+ end
@@ -0,0 +1,49 @@
1
+ # encoding: utf-8
2
+
3
+ module Crunchbase
4
+ module Model
5
+ autoload :AcquiredBy, "crunchbase/model/acquired_by"
6
+ autoload :Acquisition, "crunchbase/model/acquisition"
7
+ autoload :Address, "crunchbase/model/address"
8
+ autoload :AdvisoryRole, "crunchbase/model/advisory_role"
9
+ autoload :BoardMembersAndAdvisor, "crunchbase/model/board_members_and_advisor"
10
+ autoload :Category, "crunchbase/model/category"
11
+ autoload :Competitor, "crunchbase/model/competitor"
12
+ autoload :CurrentTeam, "crunchbase/model/current_team"
13
+ autoload :Customer, "crunchbase/model/customer"
14
+ autoload :Degree, "crunchbase/model/degree"
15
+ autoload :Error, "crunchbase/model/error"
16
+ autoload :Entity, "crunchbase/model/entity"
17
+ autoload :FoundedCompany, "crunchbase/model/founded_company"
18
+ autoload :Founder, "crunchbase/model/founder"
19
+ autoload :Fund, "crunchbase/model/fund"
20
+ autoload :FundingRound, "crunchbase/model/funding_round"
21
+ autoload :Headquarter, "crunchbase/model/headquarter"
22
+ autoload :Image, "crunchbase/model/image"
23
+ autoload :Investment, "crunchbase/model/investment"
24
+ autoload :Investor, "crunchbase/model/investor"
25
+ autoload :Ipo, "crunchbase/model/ipo"
26
+ autoload :Job, "crunchbase/model/job"
27
+ autoload :Location, "crunchbase/model/location"
28
+ autoload :Member, "crunchbase/model/member"
29
+ autoload :Membership, "crunchbase/model/membership"
30
+ autoload :New, "crunchbase/model/new"
31
+ autoload :Office, "crunchbase/model/office"
32
+ autoload :Organization, "crunchbase/model/organization"
33
+ autoload :OrganizationSummary, "crunchbase/model/organization_summary"
34
+ autoload :OwnedBy, "crunchbase/model/owned_by"
35
+ autoload :PastTeam, "crunchbase/model/past_team"
36
+ autoload :Person, "crunchbase/model/person"
37
+ autoload :PersonSummary, "crunchbase/model/person_summary"
38
+ autoload :PrimaryAffiliation, "crunchbase/model/primary_affiliation"
39
+ autoload :PrimaryImage, "crunchbase/model/primary_image"
40
+ autoload :PrimaryLocation, "crunchbase/model/primary_location"
41
+ autoload :Product, "crunchbase/model/product"
42
+ autoload :School, "crunchbase/model/school"
43
+ autoload :Search, "crunchbase/model/search"
44
+ autoload :SearchResult, "crunchbase/model/search_result"
45
+ autoload :SubOrganization, "crunchbase/model/sub_organization"
46
+ autoload :Video, "crunchbase/model/video"
47
+ autoload :Website, "crunchbase/model/website"
48
+ end
49
+ end
@@ -0,0 +1,7 @@
1
+ # encoding: utf-8
2
+
3
+ module Crunchbase::Model
4
+ class AcquiredBy < Crunchbase::Model::Acquisition
5
+ RESOURCE_LIST = 'acquired_by'
6
+ end
7
+ end
@@ -0,0 +1,36 @@
1
+ # encoding: utf-8
2
+
3
+ module Crunchbase::Model
4
+ class Acquisition < Crunchbase::Model::Entity
5
+
6
+ RESOURCE_LIST = 'acquisitions'
7
+
8
+ attr_reader :api_path, :web_path, :price, :price_currency_code, :price_usd,
9
+ :payment_type, :acquisition_type, :acquisition_status, :disposition_of_acquired,
10
+ :announced_on, :announced_on_trust_code, :completed_on, :completed_on_trust_code,
11
+ :created_at, :updated_at
12
+
13
+
14
+ attr_reader :acquirer, :acquiree
15
+
16
+ attr_reader :acquirer_total_items, :acquiree_total_items
17
+
18
+ def initialize(json)
19
+ super
20
+
21
+ unless (relationships = json['relationships']).nil?
22
+ instance_relationships_object(Crunchbase::Model::Organization, 'acquiree', relationships['acquiree'])
23
+ end
24
+ end
25
+
26
+ def property_keys
27
+ %w[
28
+ api_path web_path price price_currency_code price_usd
29
+ payment_type acquisition_type acquisition_status disposition_of_acquired
30
+ announced_on announced_on_trust_code completed_on completed_on_trust_code
31
+ created_at updated_at
32
+ ]
33
+ end
34
+
35
+ end
36
+ end