crunchbase4 0.1.0 → 0.1.5
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.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +11 -1
- data/CHANGELOG.md +66 -0
- data/Gemfile.lock +4 -1
- data/README.md +572 -62
- data/crunchbase4.gemspec +7 -6
- data/lib/crunchbase.rb +30 -3
- data/lib/crunchbase/autocompletes/client.rb +75 -0
- data/lib/crunchbase/client.rb +9 -40
- data/lib/crunchbase/config.rb +1 -1
- data/lib/crunchbase/deleted_entities/client.rb +69 -0
- data/lib/crunchbase/entities/client.rb +35 -21
- data/lib/crunchbase/models.rb +11 -1
- data/lib/crunchbase/models/acquisition.rb +61 -0
- data/lib/crunchbase/models/address.rb +36 -0
- data/lib/crunchbase/models/autocomplete_entity.rb +25 -0
- data/lib/crunchbase/models/concerns/entity.rb +48 -0
- data/lib/crunchbase/models/concerns/mappings.rb +37 -0
- data/lib/crunchbase/models/deleted_entity.rb +26 -0
- data/lib/crunchbase/models/event_appearance.rb +39 -0
- data/lib/crunchbase/models/fund.rb +43 -0
- data/lib/crunchbase/models/funding_round.rb +1 -1
- data/lib/crunchbase/models/ipo.rb +48 -0
- data/lib/crunchbase/models/job.rb +42 -0
- data/lib/crunchbase/models/ownership.rb +39 -0
- data/lib/crunchbase/models/principal.rb +112 -0
- data/lib/crunchbase/searches/client.rb +57 -6
- data/lib/crunchbase/utilities/autocomplete.rb +51 -0
- data/lib/crunchbase/utilities/cb_model.rb +32 -0
- data/lib/crunchbase/utilities/deleted_entities.rb +47 -0
- data/lib/crunchbase/utilities/entity_endpoints.rb +125 -0
- data/lib/crunchbase/utilities/request.rb +47 -8
- data/lib/crunchbase/utilities/response.rb +33 -12
- data/lib/crunchbase/utilities/search_endpoints.rb +46 -0
- data/lib/crunchbase/utilities/search_query_parameters.rb +64 -0
- data/lib/crunchbase/utilities/veriables.rb +335 -0
- data/lib/crunchbase/version.rb +1 -1
- metadata +45 -12
- data/lib/crunchbase/models/entity.rb +0 -28
- data/lib/crunchbase/searches/organization.rb +0 -52
@@ -1,29 +1,80 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative '../utilities/request'
|
4
|
+
require_relative '../utilities/cb_model'
|
5
|
+
|
3
6
|
module Crunchbase
|
4
7
|
# Whole Searches endpoints
|
5
8
|
module Searches
|
6
9
|
# Send request for entities endpoints
|
10
|
+
#
|
11
|
+
# API doc:
|
12
|
+
# https://app.swaggerhub.com/apis-docs/Crunchbase/crunchbase-enterprise_api/1.0.1#/Search/post_searches_organizations
|
13
|
+
#
|
14
|
+
# Notes
|
15
|
+
# 1. Only can filter `Searchable: Yes` fields
|
16
|
+
# 2. 'name', 'website' can not use
|
7
17
|
class Client
|
8
18
|
include ::Crunchbase::Utilities::Request
|
19
|
+
include ::Crunchbase::Utilities::CbModel
|
20
|
+
|
21
|
+
attr_accessor :total_count, :count, :entities, :entity_type, :conditions
|
9
22
|
|
10
23
|
ROOT_LIST = 'searches'
|
11
24
|
LIMIT = 100
|
12
25
|
|
13
|
-
def initialize(
|
14
|
-
@
|
15
|
-
@
|
26
|
+
def initialize(conditions, entity_type)
|
27
|
+
@conditions = conditions
|
28
|
+
@entity_type = entity_type
|
16
29
|
end
|
17
30
|
|
18
31
|
# Will include all attribute from API document
|
19
|
-
def
|
20
|
-
|
32
|
+
def searches
|
33
|
+
wrapping!(
|
34
|
+
search(
|
35
|
+
root_uri,
|
36
|
+
data_raw.to_s.gsub('=>', ':')
|
37
|
+
)
|
38
|
+
)
|
21
39
|
end
|
22
40
|
|
23
41
|
private
|
24
42
|
|
43
|
+
def wrapping!(response)
|
44
|
+
query_results = search_results(response.dig('entities'))
|
45
|
+
|
46
|
+
self.total_count = response['count']
|
47
|
+
self.entities = query_results
|
48
|
+
self.count = query_results.size
|
49
|
+
self
|
50
|
+
end
|
51
|
+
|
52
|
+
def search_results(entities)
|
53
|
+
entities.each_with_object([]) do |entity, objects|
|
54
|
+
objects << cbobject.parse_response(entity, field_ids)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
25
58
|
def root_uri
|
26
|
-
[ROOT_LIST,
|
59
|
+
[ROOT_LIST, kclass_name::RESOURCE_LIST].compact.join('/')
|
60
|
+
end
|
61
|
+
|
62
|
+
# Post request raw datas
|
63
|
+
def field_ids
|
64
|
+
@conditions['field_ids'] || cbobject.basis_fields
|
65
|
+
end
|
66
|
+
|
67
|
+
def limit
|
68
|
+
@conditions['limit'] || LIMIT
|
69
|
+
end
|
70
|
+
|
71
|
+
def data_raw
|
72
|
+
{
|
73
|
+
'field_ids' => field_ids,
|
74
|
+
'order' => @conditions['order'],
|
75
|
+
'query' => @conditions['query'],
|
76
|
+
'limit' => limit
|
77
|
+
}
|
27
78
|
end
|
28
79
|
end
|
29
80
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../autocompletes/client'
|
4
|
+
|
5
|
+
module Crunchbase
|
6
|
+
# Utilities
|
7
|
+
module Utilities
|
8
|
+
# Autocomplete on Searches
|
9
|
+
module Autocomplete
|
10
|
+
# endpoint: /autocompletes
|
11
|
+
#
|
12
|
+
# Suggests matching Identifier entities based on the query and entity_def_ids provided.
|
13
|
+
#
|
14
|
+
# query * string
|
15
|
+
# Value to perform the autocomplete search with.
|
16
|
+
# collection_ids string
|
17
|
+
# A comma separated list of collection ids to search against.
|
18
|
+
# Leaving this blank means it will search across all identifiers.
|
19
|
+
# Entity defs can be constrained to specific facets by providing them as facet collections.
|
20
|
+
# Relationship collections will resolve to their underlying entity def.
|
21
|
+
#
|
22
|
+
# Collection ids are:
|
23
|
+
# organizations, people, funding_rounds, acquisitions, investments, events,
|
24
|
+
# press_references, funds, event_appearances, ipos, ownerships, categories,
|
25
|
+
# category_groups, locations, jobs
|
26
|
+
# limit integer
|
27
|
+
# Number of results to retrieve; default = 10, max = 25
|
28
|
+
#
|
29
|
+
#
|
30
|
+
# Example for organizations
|
31
|
+
#
|
32
|
+
# raw_data = {
|
33
|
+
# query: keyword,
|
34
|
+
# collection_ids: 'organizations'
|
35
|
+
# }
|
36
|
+
def autocomplete(keyword, **args)
|
37
|
+
crunchbase_autocompletes(wrapper_autocompletes_data(keyword, args))
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def crunchbase_autocompletes(raw_data)
|
43
|
+
Crunchbase::Autocompletes::Client.new(raw_data).autocompletes
|
44
|
+
end
|
45
|
+
|
46
|
+
def wrapper_autocompletes_data(keyword, **args)
|
47
|
+
{ query: keyword }.merge(args)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Crunchbase
|
4
|
+
# Utilities
|
5
|
+
module Utilities
|
6
|
+
# API Request
|
7
|
+
module CbModel
|
8
|
+
attr_accessor :entity_type
|
9
|
+
|
10
|
+
module_function
|
11
|
+
|
12
|
+
def cbobject
|
13
|
+
kclass_name.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def kclass_name
|
17
|
+
@kclass_name ||= exact_kclass_object
|
18
|
+
end
|
19
|
+
|
20
|
+
def exact_kclass_object
|
21
|
+
return entity_type if entity_type.is_a?(Class)
|
22
|
+
|
23
|
+
cb_type = [
|
24
|
+
'Crunchbase',
|
25
|
+
'Models',
|
26
|
+
entity_type.split('_').map(&:capitalize).join
|
27
|
+
].join('::')
|
28
|
+
Kernel.const_get("::#{cb_type}")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../deleted_entities/client'
|
4
|
+
|
5
|
+
module Crunchbase
|
6
|
+
# Utilities
|
7
|
+
module Utilities
|
8
|
+
# Autocomplete on Searches
|
9
|
+
module DeletedEntities
|
10
|
+
# endpoint: /deleted_entities
|
11
|
+
#
|
12
|
+
# Retrieve deleted entities
|
13
|
+
# Retrieve deleted entities for a collection id
|
14
|
+
#
|
15
|
+
# API doc:
|
16
|
+
# https://app.swaggerhub.com/apis-docs/Crunchbase/crunchbase-enterprise_api/1.0.1#/Deleted%20Entities/get_deleted_entities
|
17
|
+
#
|
18
|
+
# Parameters:
|
19
|
+
# collection_ids: string
|
20
|
+
# Filter by collection id(s). Comma separated list of collection ids.
|
21
|
+
# E.g.
|
22
|
+
# organizations, people, funding_rounds, acquisitions, investments,
|
23
|
+
# events, press_references, funds, event_appearances, ipos, ownerships,
|
24
|
+
# categories, category_groups, locations, jobs
|
25
|
+
# before_id: string
|
26
|
+
# Used to paginate search results to the previous page. before_id should be the uuid of the first item in the current page.
|
27
|
+
# May not be provided simultaneously with after_id.
|
28
|
+
# after_id: string
|
29
|
+
# Used to paginate search results to the next page. after_id should be the uuid of the last item in the current page.
|
30
|
+
# May not be provided simultaneously with before_id.
|
31
|
+
# limit: integer
|
32
|
+
# Number of rows to return. Default is 100, min is 1, max is 1000.
|
33
|
+
# deleted_at_order: string
|
34
|
+
# Direction of sorting by deleted_at property
|
35
|
+
# Available values : asc, desc
|
36
|
+
def deleted_entities(**args)
|
37
|
+
crunchbase_deleted_entities(args)
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def crunchbase_deleted_entities(args)
|
43
|
+
Crunchbase::DeletedEntities::Client.new(args).deleted_entities
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../errors'
|
4
|
+
|
5
|
+
module Crunchbase
|
6
|
+
# Utilities
|
7
|
+
module Utilities
|
8
|
+
# All Entity API endpoints
|
9
|
+
module EntityEndpoints
|
10
|
+
# For Entity
|
11
|
+
#
|
12
|
+
# API Parameters
|
13
|
+
#
|
14
|
+
# entity_id: UUID or permalink of desired entity
|
15
|
+
# card_id: A card to include on the resulting entity
|
16
|
+
# order: Field name with order direction (asc/desc)
|
17
|
+
# limit: Number of rows to return. Default is 100, min is 1, max is 100.
|
18
|
+
|
19
|
+
# Lookup an Organization or single card
|
20
|
+
def organization(entity_id, **card_args)
|
21
|
+
lookup_for('organization', entity_id, card_args)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Lookup Organization's all cards
|
25
|
+
def organization_cards(entity_id, cards: [])
|
26
|
+
entities('organization', entity_id).fetch_cards(cards)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Lookup a Person or single card
|
30
|
+
def person(entity_id, **card_args)
|
31
|
+
lookup_for('person', entity_id, card_args)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Lookup Person's all cards
|
35
|
+
def person_cards(entity_id, cards: [])
|
36
|
+
entities('person', entity_id).fetch_cards(cards)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Lookup a Funding Round or single card
|
40
|
+
def funding_round(entity_id, **card_args)
|
41
|
+
lookup_for('funding_round', entity_id, card_args)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Lookup Funding Round's all cards
|
45
|
+
def funding_round_cards(entity_id, cards: [])
|
46
|
+
entities('funding_round', entity_id).fetch_cards(cards)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Lookup an Acquisition or Single card
|
50
|
+
def acquisition(entity_id, **card_args)
|
51
|
+
lookup_for('acquisition', entity_id, card_args)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Lookup Acquisition's all card
|
55
|
+
def acquisition_cards(entity_id, cards: [])
|
56
|
+
entities('acquisition', entity_id).fetch_cards(cards)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Lookup an Investment or Single card
|
60
|
+
def investment(entity_id, **card_args)
|
61
|
+
lookup_for('investment', entity_id, card_args)
|
62
|
+
end
|
63
|
+
|
64
|
+
# Lookup Investment's all card
|
65
|
+
def investment_cards(entity_id, cards: [])
|
66
|
+
entities('investment', entity_id).fetch_cards(cards)
|
67
|
+
end
|
68
|
+
|
69
|
+
# Lookup an PressReference or Single card
|
70
|
+
def press_reference(entity_id, **card_args)
|
71
|
+
lookup_for('press_reference', entity_id, card_args)
|
72
|
+
end
|
73
|
+
|
74
|
+
# Lookup PressReference's all card
|
75
|
+
def press_reference_cards(entity_id, cards: [])
|
76
|
+
entities('press_reference', entity_id).fetch_cards(cards)
|
77
|
+
end
|
78
|
+
|
79
|
+
# Lookup an Ipo or Single card
|
80
|
+
def ipo(entity_id, **card_args)
|
81
|
+
lookup_for('ipo', entity_id, card_args)
|
82
|
+
end
|
83
|
+
|
84
|
+
# Lookup Ipo's all card
|
85
|
+
def ipo_cards(entity_id, cards: [])
|
86
|
+
entities('ipo', entity_id).fetch_cards(cards)
|
87
|
+
end
|
88
|
+
|
89
|
+
# Lookup an fund or Single card
|
90
|
+
def fund(entity_id, **card_args)
|
91
|
+
lookup_for('fund', entity_id, card_args)
|
92
|
+
end
|
93
|
+
|
94
|
+
# Lookup fund's all card
|
95
|
+
def fund_cards(entity_id, cards: [])
|
96
|
+
entities('fund', entity_id).fetch_cards(cards)
|
97
|
+
end
|
98
|
+
|
99
|
+
# Lookup an fund or Single card
|
100
|
+
def ownership(entity_id, **card_args)
|
101
|
+
lookup_for('ownership', entity_id, card_args)
|
102
|
+
end
|
103
|
+
|
104
|
+
# Lookup fund's all card
|
105
|
+
def ownership_cards(entity_id, cards: [])
|
106
|
+
entities('ownership', entity_id).fetch_cards(cards)
|
107
|
+
end
|
108
|
+
|
109
|
+
private
|
110
|
+
|
111
|
+
def entities(entity_type, entity_id)
|
112
|
+
Crunchbase::Entities::Client.new(entity_id, entity_type)
|
113
|
+
end
|
114
|
+
|
115
|
+
def lookup_for(entity_type, entity_id, **card_args)
|
116
|
+
kobject = entities(entity_type, entity_id)
|
117
|
+
|
118
|
+
card_id = card_args&.delete(:card_id)
|
119
|
+
return kobject.fetch if card_id.nil?
|
120
|
+
|
121
|
+
kobject.cards(card_id, card_args)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -2,37 +2,76 @@
|
|
2
2
|
|
3
3
|
require 'faraday'
|
4
4
|
require 'faraday_middleware'
|
5
|
+
require 'faraday_curl'
|
6
|
+
require 'logger'
|
7
|
+
require_relative '../errors'
|
5
8
|
|
6
9
|
module Crunchbase
|
7
10
|
# Utilities
|
8
11
|
module Utilities
|
9
|
-
#
|
12
|
+
# Key Reminder
|
13
|
+
#
|
14
|
+
# entity_id must be provided in the request
|
15
|
+
# entity_id can be the uuid or the permalink of the entity
|
16
|
+
# you can pass your API key in the request's header if you do not want to pass the API key in the URL
|
10
17
|
module Request
|
11
18
|
module_function
|
12
19
|
|
20
|
+
# Autocompletes endpoint
|
21
|
+
def get(uri, *args)
|
22
|
+
fetch_request(uri, *args)
|
23
|
+
end
|
24
|
+
|
25
|
+
def deleted(uri, *args)
|
26
|
+
fetch_request(uri, *args)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Entity endpoints
|
30
|
+
#
|
31
|
+
# https://app.swaggerhub.com/apis-docs/Crunchbase/crunchbase-enterprise_api/1.0.1#/Entity/get_entities_organizations__entity_id_
|
13
32
|
def entity(uri, *args)
|
14
|
-
|
33
|
+
fetch_request(uri, *args)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Search endpoints
|
37
|
+
#
|
38
|
+
# https://app.swaggerhub.com/apis-docs/Crunchbase/crunchbase-enterprise_api/1.0.1#/Search/post_searches_organizations
|
39
|
+
def search(uri, args)
|
40
|
+
response = Faraday.new(url: BASE_URI, headers: post_headers) do |faraday|
|
15
41
|
faraday.adapter Faraday.default_adapter
|
16
42
|
faraday.response :json
|
17
|
-
|
43
|
+
faraday.request :curl, ::Logger.new(STDOUT), :warn if debug_mode?
|
44
|
+
faraday.response :logger, ::Logger.new(STDOUT), bodies: true if debug_mode?
|
45
|
+
end.post(uri, args)
|
18
46
|
|
19
47
|
return response.body if response.status == 200
|
20
48
|
|
21
|
-
raise Error, response.
|
49
|
+
raise Error, response.body[0]['message']
|
22
50
|
end
|
23
51
|
|
24
|
-
|
52
|
+
private
|
53
|
+
|
54
|
+
def fetch_request(uri, *args)
|
25
55
|
response = Faraday.new(url: BASE_URI, headers: headers) do |faraday|
|
26
56
|
faraday.adapter Faraday.default_adapter
|
27
57
|
faraday.response :json
|
28
|
-
|
58
|
+
faraday.response :logger, ::Logger.new(STDOUT), bodies: true if debug_mode?
|
59
|
+
end.get(uri, *args)
|
29
60
|
|
30
61
|
return response.body if response.status == 200
|
31
62
|
|
32
|
-
raise Error, response.
|
63
|
+
raise Error, response.status == 400 ? response.body[0]['message'] : response.body['error']
|
33
64
|
end
|
34
65
|
|
35
|
-
|
66
|
+
def debug_mode?
|
67
|
+
Crunchbase.config.debug || false
|
68
|
+
end
|
69
|
+
|
70
|
+
def post_headers
|
71
|
+
headers.merge(
|
72
|
+
'Content-Type' => 'application/json'
|
73
|
+
)
|
74
|
+
end
|
36
75
|
|
37
76
|
def headers
|
38
77
|
{
|
@@ -10,18 +10,20 @@ module Crunchbase
|
|
10
10
|
def dynamic_attributes(object, attribute_names, response)
|
11
11
|
attribute_names.each do |attribute_name|
|
12
12
|
attribute_value = field_value(attribute_name, response)
|
13
|
+
dynamic_define_method(object, attribute_name, attribute_value)
|
14
|
+
end
|
13
15
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
instance_variable_set('@' + attribute_name, value)
|
18
|
-
end
|
16
|
+
[attribute_names & special_attributes].flatten.each do |attribute_name|
|
17
|
+
attribute_names.delete(attribute_name)
|
18
|
+
hash_datas = response&.dig(attribute_name)
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
values = hash_datas&.map { |k, v| v if %w[uuid permalink value].include?(k) }&.compact || []
|
21
|
+
dynamic_define_method(object, attribute_name, values)
|
22
|
+
hash_datas&.keys&.each do |key|
|
23
|
+
next unless %w[uuid permalink].include?(key)
|
23
24
|
|
24
|
-
|
25
|
+
dynamic_define_method(object, key, hash_datas&.dig(key))
|
26
|
+
end
|
25
27
|
end
|
26
28
|
|
27
29
|
object
|
@@ -29,13 +31,32 @@ module Crunchbase
|
|
29
31
|
|
30
32
|
private
|
31
33
|
|
34
|
+
def dynamic_define_method(object, attribute_name, attribute_value)
|
35
|
+
# Manually creates methods for both getter and setter and then
|
36
|
+
# sends a message to the new setter with the attribute_value
|
37
|
+
object.class.send(:define_method, "#{attribute_name}=".to_sym) do |value|
|
38
|
+
instance_variable_set('@' + attribute_name, value)
|
39
|
+
end
|
40
|
+
|
41
|
+
object.class.send(:define_method, attribute_name.to_sym) do
|
42
|
+
instance_variable_get('@' + attribute_name.to_s)
|
43
|
+
end
|
44
|
+
|
45
|
+
object.send("#{attribute_name}=".to_sym, attribute_value)
|
46
|
+
end
|
47
|
+
|
48
|
+
# This is hash attributes
|
49
|
+
#
|
50
|
+
# 1. identifier
|
51
|
+
def special_attributes
|
52
|
+
%w[identifier]
|
53
|
+
end
|
54
|
+
|
32
55
|
def field_value(name, data)
|
33
56
|
value = data.dig(name)
|
34
57
|
|
35
58
|
return value if value.nil? || value.is_a?(String)
|
36
|
-
if value.is_a?(Array) && value[0].is_a?(Hash) && value[0].keys.include?('value')
|
37
|
-
return value.collect { |e| e.dig('value') }
|
38
|
-
end
|
59
|
+
return value.collect { |e| e.dig('value') } if value.is_a?(Array) && value[0].is_a?(Hash) && value[0].keys.include?('value')
|
39
60
|
return value.dig('value') if value.is_a?(Hash) && value.keys.include?('value')
|
40
61
|
|
41
62
|
value
|