crunchbase 0.0.5 → 0.1.0

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.
@@ -9,15 +9,51 @@ use the {YAJL gem}[http://github.com/brianmario/yajl-ruby]; if not, it will
9
9
  fall back to the {JSON gem}[http://flori.github.com/json/]. Please ensure one
10
10
  of the two is installed.
11
11
 
12
- == Basic Usage
12
+ == Usage
13
+
14
+ If you already know the permalink for a given entity, you can grab the entry
15
+ with the +get+ method.
13
16
 
14
17
  require 'crunchbase'
15
18
  steve = Crunchbase::Person.get("steve-jobs")
16
19
  facebook = Crunchbase::Company.get("facebook")
20
+
21
+ If you know the name of the entity but not the permalink, you can use the
22
+ +find+ method.
23
+
24
+ steve = Crunchbase::Person.find("Steve", "Jobs")
25
+ github = Crunchbase::Company.find("Github")
26
+
27
+ Note that finding using a name performs two HTTP requests internally, the first
28
+ returning the permalink associated with the name, and the second which returns
29
+ the actual data.
30
+
31
+ === Search
32
+
33
+ Searching the Crunchbase is possible with the Search class.
34
+
35
+ s = Crunchbase::Search.find("widgets")
36
+
37
+ You can access the search results by treating the returned Search instance as
38
+ an array.
39
+
40
+ first_result = s[0]
41
+ s.each { |result| puts result.name }
42
+
43
+ While Search does include the Enumerable module, it does not implement all of
44
+ the methods of Array. If you need to treat the results as an array in a way not
45
+ supported, you can call +to_ary+; this prefetches all result pages (if they have
46
+ not already been loaded), so it may entail a slight delay, depending on the
47
+ number of results.
48
+
49
+ all_results = s.to_ary
50
+ result_slice = s[3..6]
51
+
52
+ Coming Soon: List of Entities
17
53
 
18
54
  == Copyright
19
55
 
20
- Copyright (c) 2011 Tyler Cunnion. This software is made available under the
56
+ Copyright (c) 2011-12 Tyler Cunnion. This software is made available under the
21
57
  MIT/X11 license. See LICENSE.txt for further details.
22
58
 
23
59
  I am not affiliated in any way with AOL, TechCrunch, Crunchbase, or anyone
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.5
1
+ 0.1.0
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{crunchbase}
8
- s.version = "0.0.5"
8
+ s.version = "0.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = [%q{Tyler Cunnion}]
12
- s.date = %q{2012-02-02}
12
+ s.date = %q{2012-02-21}
13
13
  s.email = %q{tyler.cunnion@gmail.com}
14
14
  s.extra_rdoc_files = [
15
15
  "LICENSE.txt",
@@ -37,12 +37,16 @@ Gem::Specification.new do |s|
37
37
  "lib/crunchbase/relationships/firm_relationship.rb",
38
38
  "lib/crunchbase/relationships/person_relationship.rb",
39
39
  "lib/crunchbase/relationships/provider_relationship.rb",
40
+ "lib/crunchbase/search.rb",
41
+ "lib/crunchbase/search_result.rb",
40
42
  "lib/crunchbase/service_provider.rb",
41
43
  "spec/crunchbase/api_spec.rb",
42
44
  "spec/crunchbase/company_spec.rb",
43
45
  "spec/crunchbase/financial_organization_spec.rb",
44
46
  "spec/crunchbase/person_spec.rb",
45
47
  "spec/crunchbase/product_spec.rb",
48
+ "spec/crunchbase/search_result_spec.rb",
49
+ "spec/crunchbase/search_spec.rb",
46
50
  "spec/crunchbase/service_provider_spec.rb",
47
51
  "spec/fixtures/brad-fitzpatrick.js",
48
52
  "spec/fixtures/steve-jobs.js",
@@ -11,8 +11,10 @@ require 'crunchbase/relationship'
11
11
  require 'crunchbase/relationships/firm_relationship'
12
12
  require 'crunchbase/relationships/person_relationship'
13
13
  require 'crunchbase/relationships/provider_relationship'
14
+ require 'crunchbase/search'
15
+ require 'crunchbase/search_result'
14
16
  require 'crunchbase/crunch_exception'
15
17
 
16
18
  module Crunchbase
17
- VERSION = "0.0.5"
19
+ VERSION = "0.1.0"
18
20
  end
@@ -1,3 +1,4 @@
1
+ # -*- coding: utf-8 -*-
1
2
  require 'net/http'
2
3
 
3
4
  begin
@@ -16,6 +17,10 @@ module Crunchbase
16
17
  # methods provided on each entity class instead of calling these directly.
17
18
  class API
18
19
  CB_URL = 'http://api.crunchbase.com/v/1/'
20
+ @timeout_limit = 60
21
+ @redirect_limit = 2
22
+
23
+ class << self; attr_accessor :timeout_limit, :redirect_limit end
19
24
 
20
25
  def self.person(permalink)
21
26
  fetch(permalink, 'person')
@@ -38,19 +43,8 @@ module Crunchbase
38
43
  end
39
44
 
40
45
  private
41
-
42
- # Fetches URI and parses JSON. Raises Timeout::Error if fetching times out.
43
- # Raises CrunchException if the returned JSON indicates an error.
44
- def self.fetch(permalink, object_name)
45
- uri = CB_URL + "#{object_name}/#{permalink}.js"
46
- resp = Timeout::timeout(60) {
47
- get_url_following_redirects(uri, 5)
48
- }
49
- j = parser.parse(resp)
50
- raise CrunchException, j["error"] if j["error"]
51
- return j
52
- end
53
-
46
+
47
+ # Returns the JSON parser, whether that's an instance of Yajl or JSON
54
48
  def self.parser
55
49
  if defined?(Yajl)
56
50
  Yajl::Parser
@@ -59,14 +53,48 @@ module Crunchbase
59
53
  end
60
54
  end
61
55
 
56
+ # Fetches URI for the permalink interface.
57
+ def self.fetch(permalink, object_name)
58
+ uri = CB_URL + "#{object_name}/#{permalink}.js"
59
+ get_json_response(uri)
60
+ end
61
+
62
+ # Fetches URI for the search interface.
63
+ def self.search(query, page=1)
64
+ require "cgi"
65
+ uri = CB_URL + "search.js?query=#{CGI.escape(query)}&page=#{page}"
66
+ get_json_response(uri)
67
+ end
68
+
69
+ # Searches for a permalink in a particular category.
70
+ def self.permalink(parameters, category)
71
+ require "cgi"
72
+ qs = parameters.map{|k,v| "#{CGI.escape(k.to_s)}=#{CGI.escape(v)}"}.join('&')
73
+ uri = CB_URL + "#{category}/permalink?#{qs}"
74
+ get_json_response(uri)
75
+ end
76
+
77
+ # Gets specified URI, then parses the returned JSON. Raises Timeout error
78
+ # if request time exceeds set limit. Raises CrunchException if returned
79
+ # JSON contains an error.
80
+ def self.get_json_response(uri)
81
+ resp = Timeout::timeout(@timeout_limit) {
82
+ get_url_following_redirects(uri, @redirect_limit)
83
+ }
84
+ j = parser.parse(resp)
85
+ raise CrunchException, j["error"] if j["error"]
86
+ j
87
+ end
88
+
89
+ # Performs actual HTTP requests, recursively if a redirect response is
90
+ # encountered. Will raise HTTP error if response is not 200, 404, or 3xx.
62
91
  def self.get_url_following_redirects(uri_str, limit = 10)
63
92
  raise CrunchException, 'HTTP redirect too deep' if limit == 0
64
93
 
65
94
  url = URI.parse(uri_str)
66
- req = Net::HTTP::Get.new(url.path)
67
- response = Net::HTTP.start(url.host, url.port) { |http| http.request(req) }
95
+ response = Net::HTTP.start(url.host, url.port) { |http| http.get(url.request_uri) }
68
96
  case response
69
- when Net::HTTPSuccess
97
+ when Net::HTTPSuccess, Net::HTTPNotFound
70
98
  response.body
71
99
  when Net::HTTPRedirection
72
100
  get_url_following_redirects(response['location'], limit - 1)
@@ -8,6 +8,7 @@ module Crunchbase
8
8
  @tag_list.respond_to?('split') ? @tag_list.split(', ') : []
9
9
  end
10
10
 
11
+ # Returns an array of aliases
11
12
  def aliases
12
13
  @alias_list.respond_to?('split') ? @alias_list.split(", ") : []
13
14
  end
@@ -1,5 +1,6 @@
1
1
  require 'date'
2
2
  module Crunchbase
3
+ # Represents a Company listed in the Crunchbase.
3
4
  class Company < CB_Object
4
5
 
5
6
  include Crunchbase::DateMethods
@@ -18,6 +19,11 @@ module Crunchbase
18
19
  c = Company.new(j)
19
20
  return c
20
21
  end
22
+
23
+ # Factory method to return a Company instance from a company name.
24
+ def self.find(name)
25
+ get(API.permalink({name: name}, "companies")["permalink"])
26
+ end
21
27
 
22
28
  def initialize(json)
23
29
  @name = json["name"]
@@ -72,6 +78,7 @@ module Crunchbase
72
78
  @deadpooled ||= date_from_components(@deadpooled_year, @deadpooled_month, @deadpooled_day)
73
79
  end
74
80
 
81
+ # Returns an array of Product objects, representing this Company's products.
75
82
  def products
76
83
  @products ||= @products_list.map {|p| Product.get(p['permalink']) }
77
84
  end
@@ -1,5 +1,6 @@
1
1
  require 'date'
2
2
  module Crunchbase
3
+ # Represents a Financial Organization listed in the Crunchbase.
3
4
  class FinancialOrganization < CB_Object
4
5
 
5
6
  include Crunchbase::DateMethods
@@ -16,6 +17,10 @@ module Crunchbase
16
17
  f = FinancialOrganization.new(j)
17
18
  return f
18
19
  end
20
+
21
+ def self.find(name)
22
+ get(API.permalink({name: name}, "financial-organizations")["permalink"])
23
+ end
19
24
 
20
25
  def initialize(json)
21
26
  @name = json['name']
@@ -53,4 +58,4 @@ module Crunchbase
53
58
  @founded ||= date_from_components(@founded_year, @founded_month, @founded_day)
54
59
  end
55
60
  end
56
- end
61
+ end
@@ -16,6 +16,10 @@ module Crunchbase
16
16
  p = Person.new(j)
17
17
  return p
18
18
  end
19
+
20
+ def self.find(first_name, last_name)
21
+ get(API.permalink({first_name: first_name, last_name: last_name}, "people")["permalink"])
22
+ end
19
23
 
20
24
  def initialize(json)
21
25
  @first_name = json["first_name"]
@@ -52,4 +56,4 @@ module Crunchbase
52
56
  end
53
57
 
54
58
  end
55
- end
59
+ end
@@ -14,6 +14,10 @@ module Crunchbase
14
14
  j = API.product(permalink)
15
15
  return Product.new(j)
16
16
  end
17
+
18
+ def self.find(name)
19
+ get(API.permalink({name: name}, "products")["permalink"])
20
+ end
17
21
 
18
22
  def initialize(json)
19
23
  @name = json['name']
@@ -63,4 +67,4 @@ module Crunchbase
63
67
  return @company
64
68
  end
65
69
  end
66
- end
70
+ end
@@ -0,0 +1,74 @@
1
+ module Crunchbase
2
+
3
+ # The Search class provides access to the Crunchbase search API. To perform a
4
+ # search, call the find class method, which returns an object of the Search
5
+ # class. This object represents an array of SearchResult objects, which may
6
+ # be addressed in a way analogous to an Array. These results are loaded on
7
+ # demand, in line with the CB API which returns results in pages of 10. When
8
+ # requesting a result index that has not been loaded yet, a new request is
9
+ # made to fetch it, resulting in a small delay. The class implements the
10
+ # Enumerable module, allowing usage of +map+, +select+, etc. If this is not
11
+ # sufficient, and full access to the underlying array is required, you may
12
+ # call to_ary, which will return the entire array including all results. If
13
+ # not all results have been fetched yet, there will be a delay to retrieve
14
+ # them, so consider this if your search contains a large number of results.
15
+ class Search
16
+ include Enumerable
17
+
18
+ attr_reader :size, :crunchbase_url
19
+ alias :length :size
20
+
21
+ # Performs a Crunchbase search for query.
22
+ def self.find(query)
23
+ j = API.search(query)
24
+ s = Search.new(query, j)
25
+ end
26
+
27
+ def initialize(query, json)
28
+ @query = query
29
+ @results = []
30
+ @size = json["total"]
31
+ @crunchbase_url = json["crunchbase_url"]
32
+ populate_results(json)
33
+ end
34
+
35
+ def [](key)
36
+ if key.kind_of?(Integer)
37
+ r = @results[key]
38
+ unless r.nil? && key < @size
39
+ r
40
+ else
41
+ retrieve_for_index(key)
42
+ @results[key]
43
+ end
44
+ end
45
+ end
46
+
47
+ # Returns array of all search results (not just ones currently loaded.)
48
+ # This enables the user to take advantage of all Array methods, not just
49
+ # the ones implmented on Search.
50
+ def to_ary
51
+ self.map{|result| result}
52
+ end
53
+
54
+ # Calls _block_ once for each search result, passing that item as a
55
+ # parameter.
56
+ def each(&block) # :yields: result
57
+ 0.upto(@size - 1) {|x| yield self[x]}
58
+ end
59
+
60
+ private
61
+
62
+ def populate_results(json)
63
+ page = json["page"]
64
+ results = json["results"].map{|r| SearchResult.new(r)}
65
+ start = (page - 1) * 10
66
+ @results[start, results.length] = results
67
+ end
68
+
69
+ def retrieve_for_index(index)
70
+ page = (index / 10) + 1
71
+ populate_results(API.search(@query, page))
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,63 @@
1
+ module Crunchbase
2
+ # Represents a single search result arising from a Search. The information
3
+ # returned from a search includes the name, namespace (i.e. entity type),
4
+ # permalink, and an overview. You may also choose to retrieve the full
5
+ # entity with the entity method.
6
+ class SearchResult
7
+ attr_reader :permalink, :crunchbase_url, :namespace, :overview
8
+
9
+ def first_name
10
+ raise CrunchException, "Not available for this entity" unless namespace == "person"
11
+ @first_name
12
+ end
13
+
14
+ def last_name
15
+ raise CrunchException, "Not available for this entity" unless namespace == "person"
16
+ @last_name
17
+ end
18
+
19
+ # Returns concatenation of first and last names if person, otherwise
20
+ # returns name. Thus, if you wanted to, for example, iterate over search
21
+ # results and output the name, you could do so without checking entity type
22
+ # first.
23
+ def name
24
+ if @namespace == "person"
25
+ @first_name + " " + @last_name
26
+ else
27
+ @name
28
+ end
29
+ end
30
+
31
+ def initialize(json)
32
+ @namespace = json["namespace"]
33
+ if @namespace == "person"
34
+ @first_name = json["first_name"]
35
+ @last_name = json["last_name"]
36
+ else
37
+ @name = json["name"]
38
+ end
39
+ @permalink = json["permalink"]
40
+ @crunchbase_url = json["crunchbase_url"]
41
+ @overview = json["overview"]
42
+ end
43
+
44
+ # Returns the entity associated with the search result, loading from
45
+ # memory if previously fetched, unless +force_reload+ is set to true.
46
+ def entity(force_reload=false)
47
+ return @entity unless @entity.nil? || force_reload
48
+ @entity = case @namespace
49
+ when "company"
50
+ Company.get(@permalink)
51
+ when "financial-organization"
52
+ FinancialOrganization.get(@permalink)
53
+ when "person"
54
+ Person.get(@permalink)
55
+ when "product"
56
+ Product.get(@permalink)
57
+ when "service-provider"
58
+ ServiceProvider.get(@permalink)
59
+ end
60
+ return @entity
61
+ end
62
+ end
63
+ end
@@ -12,6 +12,10 @@ module Crunchbase
12
12
  s = ServiceProvider.new(j)
13
13
  return s
14
14
  end
15
+
16
+ def self.find(name)
17
+ get(API.permalink({name: name}, "service-providers")["permalink"])
18
+ end
15
19
 
16
20
  def initialize(json)
17
21
  @name = json["name"]
@@ -32,4 +36,4 @@ module Crunchbase
32
36
 
33
37
 
34
38
  end
35
- end
39
+ end
@@ -23,5 +23,11 @@ module Crunchbase
23
23
  c.name.should == "Adobe Systems"
24
24
  end
25
25
 
26
+ it "should find a permalink from a well-formed search" do
27
+ j = API.permalink({name: "Accel Partners"}, "financial-organizations")
28
+ j.class.should == Hash
29
+ j["permalink"].should == 'accel-partners'
30
+ end
31
+
26
32
  end
27
- end
33
+ end
@@ -7,6 +7,11 @@ module Crunchbase
7
7
  company = Company.get("facebook")
8
8
  company.name.should == "Facebook"
9
9
  end
10
+
11
+ it "should find companies by name" do
12
+ company = Company.find("Adobe Systems")
13
+ company.permalink.should == "adobe-systems"
14
+ end
10
15
 
11
16
  it "should return date for founded" do
12
17
  company = Company.new({"founded_year" => 2004, "founded_month" => 2,
@@ -24,4 +29,4 @@ module Crunchbase
24
29
 
25
30
 
26
31
  end
27
- end
32
+ end
@@ -7,6 +7,11 @@ module Crunchbase
7
7
  finorg = FinancialOrganization.get("robin-hood-ventures")
8
8
  finorg.name.should == "Robin Hood Ventures"
9
9
  end
10
+
11
+ it "should find by name" do
12
+ f = FinancialOrganization.find("Accel Partners")
13
+ f.permalink.should == "accel-partners"
14
+ end
10
15
 
11
16
  it "should return date for founded" do
12
17
  finorg = FinancialOrganization.new({"founded_year" => 2004, "founded_month" => 2,
@@ -16,4 +21,4 @@ module Crunchbase
16
21
  end
17
22
 
18
23
  end
19
- end
24
+ end
@@ -60,6 +60,11 @@ module Crunchbase
60
60
  person = Person.get("steve-jobs")
61
61
  person.first_name.should == "Steve"
62
62
  end
63
+
64
+ it "should find a person by name" do
65
+ person = Person.find("Steve", "Jobs")
66
+ person.permalink.should == "steve-jobs"
67
+ end
63
68
 
64
69
  it "should be equal to another with the same permalink and last updated" do
65
70
  person = Person.get("steve-jobs")
@@ -68,4 +73,4 @@ module Crunchbase
68
73
  end
69
74
 
70
75
  end
71
- end
76
+ end
@@ -7,6 +7,11 @@ module Crunchbase
7
7
  product = Product.get("iphone")
8
8
  product.name.should == "iPhone"
9
9
  end
10
+
11
+ it "should find by name" do
12
+ product = Product.find("iPhone")
13
+ product.permalink.should == "iphone"
14
+ end
10
15
 
11
16
  it "should return date for launched" do
12
17
  product = Product.new({"launched_year" => 2004, "launched_month" => 2,
@@ -22,4 +27,4 @@ module Crunchbase
22
27
  product.deadpooled.should === Date.new(2004, 2, 1)
23
28
  end
24
29
  end
25
- end
30
+ end
@@ -0,0 +1,16 @@
1
+ require File.join(File.dirname(__FILE__), "..", "spec_helper.rb")
2
+ require 'net/http'
3
+
4
+ module Crunchbase
5
+ describe SearchResult do
6
+
7
+ before(:all) do
8
+ @result = Search.find('google')[0]
9
+ end
10
+
11
+ it "should return the entity which is named" do
12
+ @result.name.should == @result.entity.name
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,23 @@
1
+ require File.join(File.dirname(__FILE__), "..", "spec_helper.rb")
2
+ require 'net/http'
3
+
4
+ module Crunchbase
5
+ describe Search do
6
+
7
+ it "should retrieve search results" do
8
+ s = Search.find('google')
9
+ s[0].class.should == SearchResult
10
+ end
11
+
12
+ it "should return higher search results" do
13
+ s = Search.find('google')
14
+ s[s.size/2].class.should == SearchResult
15
+ end
16
+
17
+ it "should return nil for array out of bounds" do
18
+ s = Search.find('google')
19
+ s[s.size].should be_nil
20
+ end
21
+
22
+ end
23
+ end
@@ -6,7 +6,12 @@ module Crunchbase
6
6
  it "should pull from web api" do
7
7
  sp = ServiceProvider.get("fox-rothschild")
8
8
  sp.name.should == "Fox Rothschild"
9
- end
9
+ end
10
+
11
+ it "should find by name" do
12
+ sp = ServiceProvider.find("Fox Rothschild")
13
+ sp.permalink.should == "fox-rothschild"
14
+ end
10
15
 
11
16
  end
12
- end
17
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: crunchbase
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-02 00:00:00.000000000Z
12
+ date: 2012-02-21 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70273283484480 !ruby/object:Gem::Requirement
16
+ requirement: &70265569207100 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70273283484480
24
+ version_requirements: *70265569207100
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: bundler
27
- requirement: &70273283483700 !ruby/object:Gem::Requirement
27
+ requirement: &70265569206160 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.0.0
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70273283483700
35
+ version_requirements: *70265569206160
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: jeweler
38
- requirement: &70273283482860 !ruby/object:Gem::Requirement
38
+ requirement: &70265569205140 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 1.6.4
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70273283482860
46
+ version_requirements: *70265569205140
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rcov
49
- requirement: &70273283481660 !ruby/object:Gem::Requirement
49
+ requirement: &70265569204040 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70273283481660
57
+ version_requirements: *70265569204040
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rdoc
60
- requirement: &70273283480380 !ruby/object:Gem::Requirement
60
+ requirement: &70265569202940 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70273283480380
68
+ version_requirements: *70265569202940
69
69
  description:
70
70
  email: tyler.cunnion@gmail.com
71
71
  executables: []
@@ -95,12 +95,16 @@ files:
95
95
  - lib/crunchbase/relationships/firm_relationship.rb
96
96
  - lib/crunchbase/relationships/person_relationship.rb
97
97
  - lib/crunchbase/relationships/provider_relationship.rb
98
+ - lib/crunchbase/search.rb
99
+ - lib/crunchbase/search_result.rb
98
100
  - lib/crunchbase/service_provider.rb
99
101
  - spec/crunchbase/api_spec.rb
100
102
  - spec/crunchbase/company_spec.rb
101
103
  - spec/crunchbase/financial_organization_spec.rb
102
104
  - spec/crunchbase/person_spec.rb
103
105
  - spec/crunchbase/product_spec.rb
106
+ - spec/crunchbase/search_result_spec.rb
107
+ - spec/crunchbase/search_spec.rb
104
108
  - spec/crunchbase/service_provider_spec.rb
105
109
  - spec/fixtures/brad-fitzpatrick.js
106
110
  - spec/fixtures/steve-jobs.js
@@ -120,7 +124,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
120
124
  version: '0'
121
125
  segments:
122
126
  - 0
123
- hash: -3154475124143607106
127
+ hash: 4487821890368483707
124
128
  required_rubygems_version: !ruby/object:Gem::Requirement
125
129
  none: false
126
130
  requirements: