ingenia_api 1.0.6
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 +7 -0
- data/.gitignore +6 -0
- data/Gemfile +3 -0
- data/LICENSE +22 -0
- data/README.md +379 -0
- data/Rakefile +2 -0
- data/examples/bundles.rb +74 -0
- data/examples/classify.rb +9 -0
- data/examples/console.rb +13 -0
- data/examples/helper.rb +15 -0
- data/examples/items.rb +124 -0
- data/examples/run_all_examples.rb +7 -0
- data/examples/similar_to.rb +23 -0
- data/examples/summarize.rb +11 -0
- data/examples/tag_sets.rb +75 -0
- data/examples/tags.rb +80 -0
- data/examples/train_classify_similar_to.rb +42 -0
- data/ingenia-api.gemspec +21 -0
- data/lib/ingenia_api.rb +126 -0
- data/lib/ingenia_api/bundle.rb +62 -0
- data/lib/ingenia_api/html_extractor.rb +24 -0
- data/lib/ingenia_api/item.rb +99 -0
- data/lib/ingenia_api/remote.rb +131 -0
- data/lib/ingenia_api/tag.rb +72 -0
- data/lib/ingenia_api/tag_set.rb +59 -0
- data/spec/fixtures/empty_array.json +1 -0
- data/spec/fixtures/empty_hash.json +1 -0
- data/spec/fixtures/five_knowledge_items_index.json +1 -0
- data/spec/fixtures/knowledge_item.json +2 -0
- data/spec/fixtures/knowledge_items.json +1 -0
- data/spec/fixtures/status.json +1 -0
- data/spec/fixtures/success.json +1 -0
- data/spec/fixtures/user_tags.json +1 -0
- data/spec/ingenia_api/api_spec.rb +126 -0
- data/spec/ingenia_api/bundle_spec.rb +78 -0
- data/spec/ingenia_api/html_extractor_spec.rb +29 -0
- data/spec/ingenia_api/item_spec.rb +115 -0
- data/spec/ingenia_api/tag_set_spec.rb +78 -0
- data/spec/ingenia_api/tag_spec.rb +72 -0
- data/spec/spec_helper.rb +66 -0
- metadata +167 -0
@@ -0,0 +1,62 @@
|
|
1
|
+
class Ingenia::Bundle
|
2
|
+
include Ingenia::Api
|
3
|
+
|
4
|
+
PATH = '/bundles'
|
5
|
+
|
6
|
+
# These are known request params, all other params will go inside the json object
|
7
|
+
BUNDLE_KNOWN_PARAMS = %i{ full_text offset limit }
|
8
|
+
|
9
|
+
# Get a single bundle by id
|
10
|
+
def self.get id, params = {}
|
11
|
+
initialize_params params
|
12
|
+
|
13
|
+
Ingenia::Api.verify_response do
|
14
|
+
Remote.get "#{PATH}/#{id}", @params
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Create a new bundle
|
19
|
+
def self.create params = {}
|
20
|
+
initialize_params params
|
21
|
+
|
22
|
+
Ingenia::Api.verify_response do
|
23
|
+
Remote.post(PATH, @params )
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Update an existing bundle
|
28
|
+
def self.update id, params = {}
|
29
|
+
initialize_params params
|
30
|
+
|
31
|
+
Ingenia::Api.verify_response do
|
32
|
+
Remote.put("#{PATH}/#{id}", @params )
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
# Index your bundles
|
38
|
+
def self.all params = {}
|
39
|
+
initialize_params params
|
40
|
+
|
41
|
+
Ingenia::Api.verify_response do
|
42
|
+
Remote.get(PATH, @params )
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.destroy id
|
47
|
+
Ingenia::Api.verify_response do
|
48
|
+
Remote.delete("#{PATH}/#{id}", :params => { :api_key => Ingenia::Api.api_key} )
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
def self.initialize_params( params = {} )
|
54
|
+
# break params down into for json object and for request
|
55
|
+
request_params = params.select{ |k,v| BUNDLE_KNOWN_PARAMS.include?(k) }
|
56
|
+
json_params = params.select{ |k,v| not BUNDLE_KNOWN_PARAMS.include?(k) }
|
57
|
+
|
58
|
+
@params = { :api_key => Ingenia::Api.api_key }
|
59
|
+
@params.merge!( { :json => json_params.to_json } ) unless json_params.empty?
|
60
|
+
@params.merge! request_params
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class Ingenia::HtmlExtractor
|
2
|
+
class MissingUrl < StandardError; end
|
3
|
+
|
4
|
+
include Ingenia::Api
|
5
|
+
|
6
|
+
PATH = '/html_extractor'
|
7
|
+
|
8
|
+
# Fetch the url html
|
9
|
+
def self.fetch( params = {} )
|
10
|
+
raise(MissingUrl) unless params.has_key?(:url)
|
11
|
+
initialize_params params
|
12
|
+
|
13
|
+
Ingenia::Api.verify_response do
|
14
|
+
Remote.get( "#{PATH}/fetch", @params )
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
private
|
20
|
+
def self.initialize_params( params = {} )
|
21
|
+
@params = params.clone
|
22
|
+
@params.merge!( { :api_key => Ingenia::Api.api_key } )
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
class Ingenia::Item
|
2
|
+
include Ingenia::Api
|
3
|
+
|
4
|
+
PATH = '/items'
|
5
|
+
|
6
|
+
# Get a single item by id
|
7
|
+
def self.get( id, params = {} )
|
8
|
+
initialize_params params
|
9
|
+
|
10
|
+
Ingenia::Api.verify_response do
|
11
|
+
Remote.get( "#{PATH}/#{id}", @params )
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
##
|
16
|
+
# Create a new item
|
17
|
+
#
|
18
|
+
#
|
19
|
+
def self.create( params = {} )
|
20
|
+
initialize_params params
|
21
|
+
|
22
|
+
Ingenia::Api.verify_response do
|
23
|
+
Remote.post( PATH, @params )
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
##
|
28
|
+
# Find or create a new item by text
|
29
|
+
#
|
30
|
+
#
|
31
|
+
def self.find_or_create_by_text( params = {} )
|
32
|
+
initialize_params params
|
33
|
+
|
34
|
+
Ingenia::Api.verify_response do
|
35
|
+
Remote.post( PATH, @params )
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
#
|
40
|
+
# Update an existing item
|
41
|
+
#
|
42
|
+
def self.update( id, params = {} )
|
43
|
+
initialize_params params
|
44
|
+
|
45
|
+
Ingenia::Api.verify_response do
|
46
|
+
Remote.put("#{PATH}/#{id}", @params )
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
#
|
51
|
+
# Scan your items
|
52
|
+
#
|
53
|
+
def self.scan params = {}
|
54
|
+
initialize_params params
|
55
|
+
|
56
|
+
Ingenia::Api.verify_response do
|
57
|
+
Remote.get( "#{PATH}/scan", @params )
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
#
|
62
|
+
# Index your items
|
63
|
+
#
|
64
|
+
def self.all params = {}
|
65
|
+
initialize_params params
|
66
|
+
|
67
|
+
Ingenia::Api.verify_response do
|
68
|
+
Remote.get( PATH, @params )
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
#
|
73
|
+
# Destroy an item
|
74
|
+
#
|
75
|
+
def self.destroy id
|
76
|
+
Ingenia::Api.verify_response do
|
77
|
+
Remote.delete("#{PATH}/#{id}", :params => { :api_key => Ingenia::Api.api_key} )
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
#
|
82
|
+
# Get similar items
|
83
|
+
#
|
84
|
+
def self.similar_to(id, mode='auto', params={})
|
85
|
+
initialize_params params.merge(mode: mode.to_s)
|
86
|
+
|
87
|
+
Ingenia::Api.verify_response do
|
88
|
+
Remote.get("#{PATH}/#{id}/similar_to", @params)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
private
|
93
|
+
def self.initialize_params( params = {} )
|
94
|
+
@params = params.clone
|
95
|
+
|
96
|
+
@params[:json] = @params[:json].to_json if @params[:json]
|
97
|
+
@params.merge!( { :api_key => Ingenia::Api.api_key } )
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
|
2
|
+
module Ingenia
|
3
|
+
module Api
|
4
|
+
|
5
|
+
module Remote
|
6
|
+
ENDPOINT = 'api.ingeniapi.com'
|
7
|
+
DEFAULT_VERSION = 2.0
|
8
|
+
|
9
|
+
MAX_ATTEMPTS = 3
|
10
|
+
|
11
|
+
attr_reader :port
|
12
|
+
|
13
|
+
extend self
|
14
|
+
|
15
|
+
def get(path, opts = {})
|
16
|
+
check_params opts
|
17
|
+
|
18
|
+
handle_request do
|
19
|
+
uri = build_uri(path, opts)
|
20
|
+
JSON.parse( RestClient.get uri.to_s, :params => opts )
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
def post(path, opts = {})
|
26
|
+
check_params opts
|
27
|
+
|
28
|
+
handle_request do
|
29
|
+
uri = build_uri(path, opts)
|
30
|
+
JSON.parse( RestClient.post uri.to_s, opts )
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def put(path, opts = {})
|
35
|
+
check_params opts
|
36
|
+
|
37
|
+
handle_request do
|
38
|
+
uri = build_uri(path, opts)
|
39
|
+
JSON.parse( RestClient.put uri.to_s, opts )
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def delete(path, opts = {})
|
44
|
+
handle_request do
|
45
|
+
uri = build_uri(path, opts)
|
46
|
+
JSON.parse( RestClient.delete uri.to_s, opts )
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def endpoint=(str)
|
51
|
+
if str[ ':' ]
|
52
|
+
parts = str.split(':')
|
53
|
+
@endpoint = parts[0]
|
54
|
+
@port = parts[1].to_i
|
55
|
+
return str
|
56
|
+
end
|
57
|
+
|
58
|
+
@endpoint = str
|
59
|
+
end
|
60
|
+
|
61
|
+
def version=(str)
|
62
|
+
# safety checking on version number
|
63
|
+
if str.class == String
|
64
|
+
raise 'Please set version to a float, eg 2.0'
|
65
|
+
end
|
66
|
+
@version = str
|
67
|
+
end
|
68
|
+
|
69
|
+
def endpoint
|
70
|
+
@endpoint || ENDPOINT
|
71
|
+
end
|
72
|
+
|
73
|
+
def version_string
|
74
|
+
"v#{version.round}"
|
75
|
+
end
|
76
|
+
|
77
|
+
def version
|
78
|
+
@version || DEFAULT_VERSION
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
private
|
83
|
+
|
84
|
+
def check_params param_hash
|
85
|
+
raise "missing API key" if (not param_hash.has_key?(:api_key)) || param_hash[:api_key].nil? || param_hash[:api_key].length == 0
|
86
|
+
end
|
87
|
+
|
88
|
+
def handle_request
|
89
|
+
loop do # until successful
|
90
|
+
begin
|
91
|
+
return yield
|
92
|
+
|
93
|
+
rescue RestClient::Conflict => e
|
94
|
+
return JSON.parse e.response
|
95
|
+
|
96
|
+
rescue RestClient::RequestFailed => e
|
97
|
+
if e.response.nil? || e.response.code != 429 # throttling
|
98
|
+
return { 'status' => 'error', 'message' => e.to_s }
|
99
|
+
end
|
100
|
+
|
101
|
+
rescue RestClient::BadRequest => e
|
102
|
+
if e.response.nil?
|
103
|
+
return { 'status' => 'error', 'message' => e.to_s }
|
104
|
+
else
|
105
|
+
return JSON.parse e.response
|
106
|
+
end
|
107
|
+
|
108
|
+
rescue RestClient::UnprocessableEntity => e
|
109
|
+
return JSON.parse e.response
|
110
|
+
|
111
|
+
rescue JSON::ParserError => e
|
112
|
+
# puts e.inspect
|
113
|
+
|
114
|
+
return { 'status' => 'error', 'message' => e.to_s }
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def build_uri(path, opts = {})
|
122
|
+
path = "/#{version_string}" + path unless version.eql?(1.0)
|
123
|
+
|
124
|
+
url = URI::HTTP.build( :host => endpoint, :path => path )
|
125
|
+
url.port = port if port
|
126
|
+
|
127
|
+
url
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
class Ingenia::Tag
|
2
|
+
include Ingenia::Api
|
3
|
+
|
4
|
+
PATH = '/tags'
|
5
|
+
|
6
|
+
# These are known request params, all other params will go inside the json object
|
7
|
+
TAG_KNOWN_PARAMS = %i{ full_text offset limit tag_ids }
|
8
|
+
|
9
|
+
# Get a single tag by id
|
10
|
+
def self.get id, params = {}
|
11
|
+
initialize_params params
|
12
|
+
|
13
|
+
Ingenia::Api.verify_response do
|
14
|
+
Remote.get "#{PATH}/#{id}", @params
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Create a new tag
|
19
|
+
def self.create params = {}
|
20
|
+
initialize_params params
|
21
|
+
|
22
|
+
Ingenia::Api.verify_response do
|
23
|
+
Remote.post(PATH, @params)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Update an existing tag
|
28
|
+
def self.update id, params = {}
|
29
|
+
initialize_params params
|
30
|
+
|
31
|
+
Ingenia::Api.verify_response do
|
32
|
+
Remote.put("#{PATH}/#{id}", @params)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# Update an existing tag
|
37
|
+
def self.merge id, params = {}
|
38
|
+
# dirty hack
|
39
|
+
params[:tag_ids] = params[:tag_ids].to_json
|
40
|
+
initialize_params params
|
41
|
+
|
42
|
+
Ingenia::Api.verify_response do
|
43
|
+
Remote.post("#{PATH}/#{id}/merge", @params)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# Index your tags
|
48
|
+
def self.all params = {}
|
49
|
+
initialize_params params
|
50
|
+
|
51
|
+
Ingenia::Api.verify_response do
|
52
|
+
Remote.get(PATH, @params)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.destroy id
|
57
|
+
Ingenia::Api.verify_response do
|
58
|
+
Remote.delete("#{PATH}/#{id}", :params => { :api_key => Ingenia::Api.api_key })
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
def self.initialize_params(params = {})
|
64
|
+
# break params down into for json object and for request
|
65
|
+
request_params = params.select { |k, v| TAG_KNOWN_PARAMS.include?(k) }
|
66
|
+
json_params = params.select { |k, v| not TAG_KNOWN_PARAMS.include?(k) }
|
67
|
+
|
68
|
+
@params = { :api_key => Ingenia::Api.api_key }
|
69
|
+
@params.merge!({ :json => json_params.to_json }) unless json_params.empty?
|
70
|
+
@params.merge! request_params
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
class Ingenia::TagSet
|
2
|
+
include Ingenia::Api
|
3
|
+
|
4
|
+
PATH = '/tag_sets'
|
5
|
+
TAG_SET_KNOWN_PARAMS = %i{ offset limit }
|
6
|
+
|
7
|
+
# Get a single tag_set by id
|
8
|
+
def self.get id
|
9
|
+
Ingenia::Api.verify_response do
|
10
|
+
Remote.get "#{PATH}/#{id}", :api_key => Ingenia::Api.api_key
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# Create a new tag_set
|
15
|
+
def self.create params = {}
|
16
|
+
initialize_params params
|
17
|
+
|
18
|
+
Ingenia::Api.verify_response do
|
19
|
+
Remote.post(PATH, @params )
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# Update an existing tag_set
|
24
|
+
def self.update id, params = {}
|
25
|
+
initialize_params params
|
26
|
+
|
27
|
+
Ingenia::Api.verify_response do
|
28
|
+
Remote.put("#{PATH}/#{id}", @params )
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Index your tag_sets
|
33
|
+
def self.all params = {}
|
34
|
+
initialize_params params
|
35
|
+
|
36
|
+
Ingenia::Api.verify_response do
|
37
|
+
Remote.get(PATH, @params )
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.destroy id
|
42
|
+
Ingenia::Api.verify_response do
|
43
|
+
Remote.delete("#{PATH}/#{id}", :params => { :api_key => Ingenia::Api.api_key} )
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
private
|
49
|
+
def self.initialize_params( params = {} )
|
50
|
+
# break params down into those for json object and those for request
|
51
|
+
request_params = params.select{ |k,v| TAG_SET_KNOWN_PARAMS.include?(k) }
|
52
|
+
json_params = params.select{ |k,v| not TAG_SET_KNOWN_PARAMS.include?(k) }
|
53
|
+
|
54
|
+
|
55
|
+
@params = { :api_key => Ingenia::Api.api_key }
|
56
|
+
@params.merge!( { :json => json_params.to_json } ) unless json_params.empty?
|
57
|
+
@params.merge! request_params
|
58
|
+
end
|
59
|
+
end
|