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
data/examples/console.rb
ADDED
data/examples/helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
$: << File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
+
require 'colorize'
|
3
|
+
require 'rest_client'
|
4
|
+
|
5
|
+
# log rest client activity
|
6
|
+
# RestClient.log = STDOUT
|
7
|
+
|
8
|
+
|
9
|
+
def example title
|
10
|
+
puts "|| #{title} ||\n".yellow
|
11
|
+
|
12
|
+
yield
|
13
|
+
|
14
|
+
puts "\n\n"
|
15
|
+
end
|
data/examples/items.rb
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
require './helper'
|
2
|
+
|
3
|
+
##
|
4
|
+
# Run a full set of API calls related to items
|
5
|
+
##
|
6
|
+
|
7
|
+
|
8
|
+
# Set API key to the test user for this gem
|
9
|
+
require 'ingenia_api'
|
10
|
+
|
11
|
+
Ingenia::Api.api_key = "API_KEY"
|
12
|
+
Ingenia::Api.version = 2.0
|
13
|
+
##
|
14
|
+
# Create/Train
|
15
|
+
#
|
16
|
+
# - Creating items with (optional) tags is the same as training.
|
17
|
+
# - All new items belong to your first bundle unless specified with the bundle_id param
|
18
|
+
# - If the same text is sent twice, the old record is overwritten unless the 'update_existing' param is set to false
|
19
|
+
#
|
20
|
+
example "Create/train" do
|
21
|
+
big_text = "I like cake " * 1000
|
22
|
+
new_item = Ingenia::Item.create :json => { :text => big_text, :tags => [ 'food', 'cake', 'obsession'] }
|
23
|
+
@new_item_id = new_item['id']
|
24
|
+
|
25
|
+
puts "new item: "
|
26
|
+
puts "#{new_item}".green
|
27
|
+
|
28
|
+
# Tidy up
|
29
|
+
Ingenia::Item.destroy(@new_item_id)
|
30
|
+
|
31
|
+
# request full text response
|
32
|
+
big_text = "I like cake " * 1001
|
33
|
+
new_item = Ingenia::Item.create :json => { :text => big_text, :tags => [ 'food', 'cake', 'obsession'] }, :full_text => true
|
34
|
+
@new_item_id = new_item['id']
|
35
|
+
|
36
|
+
puts "new item with full text: "
|
37
|
+
puts "#{new_item}".green
|
38
|
+
|
39
|
+
|
40
|
+
# create without updating existing
|
41
|
+
response = Ingenia::Item.create :json => { :text => new_item['text'], :tags => [ 'not', 'changed' ] }, :update_existing => false
|
42
|
+
puts 'unchaged item'
|
43
|
+
puts "#{response}".green
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
##
|
48
|
+
# Index normal
|
49
|
+
#
|
50
|
+
example "Index normal" do
|
51
|
+
items = Ingenia::Item.all
|
52
|
+
|
53
|
+
puts "got #{items.length} items"
|
54
|
+
puts "\n First Item: "
|
55
|
+
puts "#{items.first}".green
|
56
|
+
|
57
|
+
@test_item_id = items.first['id']
|
58
|
+
end
|
59
|
+
|
60
|
+
##
|
61
|
+
# Index full text
|
62
|
+
#
|
63
|
+
example "Index full text" do
|
64
|
+
items = Ingenia::Item.all(:full_text => "true")
|
65
|
+
|
66
|
+
puts "got #{items.length} items"
|
67
|
+
puts "\n First Item: "
|
68
|
+
puts "#{items.first}".green
|
69
|
+
|
70
|
+
@test_item_id = items.first['id']
|
71
|
+
end
|
72
|
+
|
73
|
+
##
|
74
|
+
# Show
|
75
|
+
#
|
76
|
+
example "Show" do
|
77
|
+
test_item = Ingenia::Item.get(@new_item_id, :full_text => false )
|
78
|
+
puts "Quick view: "
|
79
|
+
puts "#{test_item}".green
|
80
|
+
|
81
|
+
# Get it with full text
|
82
|
+
@test_item = Ingenia::Item.get(@new_item_id, :full_text => true )
|
83
|
+
puts "\n Full text view: "
|
84
|
+
puts "#{@test_item}".green
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
##
|
89
|
+
# Update
|
90
|
+
#
|
91
|
+
example "Update" do
|
92
|
+
response = Ingenia::Item.update(@test_item_id, :json => { :text => "this is some test update text for testing the API" })
|
93
|
+
|
94
|
+
puts "updated item:"
|
95
|
+
puts "#{response}".green
|
96
|
+
|
97
|
+
# Update its tags
|
98
|
+
response = Ingenia::Item.update(@test_item_id, :json => { :text => "this is some test update text for testing the API", :tags => ['api', 'testing'] })
|
99
|
+
puts "#{response}".green
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
##
|
104
|
+
# Destroy
|
105
|
+
#
|
106
|
+
example "Destroy" do
|
107
|
+
# Remove this new item
|
108
|
+
response = Ingenia::Item.destroy(@test_item_id)
|
109
|
+
puts "#{response}".green
|
110
|
+
end
|
111
|
+
|
112
|
+
##
|
113
|
+
# Similar to - using auto matching
|
114
|
+
#
|
115
|
+
example "similar to" do
|
116
|
+
response = Ingenia::Item.similar_to(@test_item_id)
|
117
|
+
|
118
|
+
puts "#{response}".green
|
119
|
+
end
|
120
|
+
example "similar to - matching on words" do
|
121
|
+
response = Ingenia::Item.similar_to(@test_item_id, :words)
|
122
|
+
|
123
|
+
puts "#{response}".green
|
124
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require './helper'
|
2
|
+
|
3
|
+
|
4
|
+
# RestClient.log = STDOUT
|
5
|
+
require 'ingenia_api'
|
6
|
+
Ingenia::Api.api_key = "API_KEY"
|
7
|
+
|
8
|
+
# similar to text
|
9
|
+
# Moved to Ingenia::Item.similar_to
|
10
|
+
|
11
|
+
# similar to item
|
12
|
+
example "similar to item" do
|
13
|
+
response = Ingenia::Api.similar_to :item_id => Ingenia::Item.all.first['id']
|
14
|
+
|
15
|
+
puts "#{response}".green
|
16
|
+
end
|
17
|
+
|
18
|
+
# similar to tags
|
19
|
+
example "similar to tags" do
|
20
|
+
response = Ingenia::Api.similar_to :tag_ids => [ 1, 3, 5 ]
|
21
|
+
|
22
|
+
puts "#{response}".green
|
23
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require './helper'
|
2
|
+
|
3
|
+
##
|
4
|
+
# Run a full set of API calls on tag_sets
|
5
|
+
##
|
6
|
+
|
7
|
+
|
8
|
+
#
|
9
|
+
# Setup
|
10
|
+
#
|
11
|
+
# Set API key to the test user for this gem
|
12
|
+
require 'ingenia_api'
|
13
|
+
Ingenia::Api.api_key = "API_KEY"
|
14
|
+
Ingenia::Api.version = 2.0
|
15
|
+
|
16
|
+
##
|
17
|
+
# Create
|
18
|
+
#
|
19
|
+
example "Create" do
|
20
|
+
# Create a new tag_set
|
21
|
+
@new_test_tag_set = Ingenia::TagSet.create(:name => "new tag set name")
|
22
|
+
puts "\n created a new tag_set:"
|
23
|
+
puts "#{@new_test_tag_set}".green
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
##
|
28
|
+
# Index
|
29
|
+
#
|
30
|
+
example "Index" do
|
31
|
+
# Get a list of all your tag_sets
|
32
|
+
tag_sets = Ingenia::TagSet.all
|
33
|
+
puts "got #{tag_sets.length} tag_sets".green
|
34
|
+
|
35
|
+
# Get the first tag_set
|
36
|
+
@test_tag_set = tag_sets.first
|
37
|
+
|
38
|
+
puts "\n First TagSet: ".green
|
39
|
+
puts "#{@test_tag_set}".green
|
40
|
+
|
41
|
+
@test_tag_set_id = @test_tag_set['id']
|
42
|
+
@test_tag_set_name = @test_tag_set['name']
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
##
|
47
|
+
# Show
|
48
|
+
#
|
49
|
+
example "Show" do
|
50
|
+
# Get the updated tag_set, including it's text
|
51
|
+
@test_tag_set = Ingenia::TagSet.get(@test_tag_set_id)
|
52
|
+
puts "\n updated tag_set:"
|
53
|
+
puts "#{@test_tag_set}".green
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
##
|
58
|
+
# Update
|
59
|
+
#
|
60
|
+
example "Update" do
|
61
|
+
# Update its text
|
62
|
+
response = Ingenia::TagSet.update(@test_tag_set_id, :name => "updated tag_set name new")
|
63
|
+
puts "#{response}".green
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
##
|
68
|
+
# Destroy
|
69
|
+
#
|
70
|
+
example "Destroy" do
|
71
|
+
# Remove this new tag_set
|
72
|
+
response = Ingenia::TagSet.destroy(@new_test_tag_set['id'])
|
73
|
+
puts "#{response}".green
|
74
|
+
end
|
75
|
+
|
data/examples/tags.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
require './helper'
|
2
|
+
|
3
|
+
##
|
4
|
+
# Run a full set of API calls on tags
|
5
|
+
##
|
6
|
+
|
7
|
+
|
8
|
+
#
|
9
|
+
# Setup
|
10
|
+
#
|
11
|
+
# Set API key to the test user for this gem
|
12
|
+
require 'ingenia_api'
|
13
|
+
#local
|
14
|
+
Ingenia::Api.api_key = "API_KEY"
|
15
|
+
Ingenia::Api.version = 2.0
|
16
|
+
|
17
|
+
|
18
|
+
##
|
19
|
+
# Create
|
20
|
+
#
|
21
|
+
example "Create" do
|
22
|
+
# Get your tag_set
|
23
|
+
@tag_set = Ingenia::TagSet.all.first
|
24
|
+
|
25
|
+
# Create a new tag
|
26
|
+
@new_test_tag = Ingenia::Tag.create(:name => "new tag", :tag_set_id => @tag_set['id'])
|
27
|
+
puts "\n created a new tag:"
|
28
|
+
puts "#{@new_test_tag}".green
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
##
|
33
|
+
# Index
|
34
|
+
#
|
35
|
+
example "Index" do
|
36
|
+
# Get a list of all your tags
|
37
|
+
tags = Ingenia::Tag.all
|
38
|
+
puts "got #{tags.length} tags".green
|
39
|
+
|
40
|
+
# Get the first tag
|
41
|
+
@test_tag = tags.first
|
42
|
+
|
43
|
+
puts "\n First Tag: ".green
|
44
|
+
puts "#{@test_tag}".green
|
45
|
+
|
46
|
+
@test_tag_id = @test_tag['id']
|
47
|
+
@test_tag_name = @test_tag['name']
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
##
|
52
|
+
# Show
|
53
|
+
#
|
54
|
+
example "Show" do
|
55
|
+
# Get the updated tag, including it's text
|
56
|
+
@test_tag = Ingenia::Tag.get(@test_tag_id)
|
57
|
+
puts "\n updated tag:"
|
58
|
+
puts "#{@test_tag}".green
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
##
|
63
|
+
# Update
|
64
|
+
#
|
65
|
+
example "Update" do
|
66
|
+
# Update its text
|
67
|
+
response = Ingenia::Tag.update(@test_tag_id, :name => "updated tag name new", :description => "this is a testing tag", :tag_set_id => @tag_set['id'])
|
68
|
+
puts "#{response}".green
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
##
|
73
|
+
# Destroy
|
74
|
+
#
|
75
|
+
example "Destroy" do
|
76
|
+
# Remove this new tag
|
77
|
+
response = Ingenia::Tag.destroy(@new_test_tag['id'])
|
78
|
+
puts "#{response}".green
|
79
|
+
end
|
80
|
+
|
@@ -0,0 +1,42 @@
|
|
1
|
+
|
2
|
+
$: << File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
|
4
|
+
require 'yaml'
|
5
|
+
require 'ingenia_api'
|
6
|
+
|
7
|
+
def demo(name)
|
8
|
+
puts "\n\n"
|
9
|
+
puts "#\n# #{name}\n#"
|
10
|
+
|
11
|
+
output = yield
|
12
|
+
|
13
|
+
puts "output:#{output.to_yaml}"
|
14
|
+
end
|
15
|
+
|
16
|
+
def main
|
17
|
+
Ingenia::Api.api_key = "API_KEY"
|
18
|
+
|
19
|
+
# Classify some text
|
20
|
+
demo "classify" do
|
21
|
+
Ingenia::Api.classify "What kind of cheese is the best cheese?"
|
22
|
+
end
|
23
|
+
|
24
|
+
# Train text onto the default tagset
|
25
|
+
demo "train simple" do
|
26
|
+
Ingenia::Api.train "I like cheeses", [ 'food', 'preference', 'cheese' ]
|
27
|
+
end
|
28
|
+
|
29
|
+
# Train into two specific tagsets
|
30
|
+
demo "train complex" do
|
31
|
+
Ingenia::Api.train "Is it safe to eat cheese from goats?", { :Cookery => [ 'cheese', 'safety' ], :post_type => [ 'question' ] }
|
32
|
+
end
|
33
|
+
|
34
|
+
demo "find items similar to your first item" do
|
35
|
+
first_item = Ingenia::Item.all.first
|
36
|
+
|
37
|
+
puts Ingenia::Api.similar_to(:id => first_item['id'])
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
main if $0 == __FILE__
|
data/ingenia-api.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |gem|
|
4
|
+
gem.name = 'ingenia_api'
|
5
|
+
gem.authors = ['Retechnica Team']
|
6
|
+
gem.email = %w(ingenia-devs@retechnica.com)
|
7
|
+
gem.summary = 'A Ruby API client for Ingenia'
|
8
|
+
gem.description = 'A Ruby API client for Ingenia'
|
9
|
+
gem.homepage = 'http://www.ingeniapi.com'
|
10
|
+
gem.files = `git ls-files`.split($\)
|
11
|
+
gem.test_files = gem.files.grep(%r{^(spec)/})
|
12
|
+
gem.require_paths = %w(lib)
|
13
|
+
gem.version = '1.0.6'
|
14
|
+
|
15
|
+
gem.add_runtime_dependency 'rest-client', '>= 1.8.0'
|
16
|
+
gem.add_runtime_dependency 'json', '>= 1.8.3'
|
17
|
+
gem.add_runtime_dependency 'colorize', '>= 0.7.7'
|
18
|
+
|
19
|
+
gem.add_development_dependency 'rspec', '>= 3.3.0'
|
20
|
+
gem.add_development_dependency 'webmock', '>= 1.21.0'
|
21
|
+
end
|
data/lib/ingenia_api.rb
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
|
2
|
+
require 'restclient'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
require 'ostruct'
|
6
|
+
|
7
|
+
require 'ingenia_api/remote'
|
8
|
+
require 'ingenia_api/item'
|
9
|
+
require 'ingenia_api/html_extractor'
|
10
|
+
require 'ingenia_api/tag'
|
11
|
+
require 'ingenia_api/tag_set'
|
12
|
+
require 'ingenia_api/bundle'
|
13
|
+
|
14
|
+
module Ingenia
|
15
|
+
module Api
|
16
|
+
|
17
|
+
extend self
|
18
|
+
|
19
|
+
API_KNOWN_PARAMS = %w( limit text )
|
20
|
+
|
21
|
+
class CallFailed < StandardError
|
22
|
+
def initialize(output)
|
23
|
+
prefix = output['status']
|
24
|
+
message = output['message']
|
25
|
+
super "#{prefix}: #{message}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Status of your app
|
30
|
+
def status
|
31
|
+
debug { "status" }
|
32
|
+
verify_response { Remote.get('/status', :api_key => api_key ) }
|
33
|
+
end
|
34
|
+
|
35
|
+
# Classify some text
|
36
|
+
def classify(text)
|
37
|
+
debug { "classify" }
|
38
|
+
verify_response { Remote.post('/classify', :api_key => api_key, :text => text) }
|
39
|
+
end
|
40
|
+
|
41
|
+
# Deprecated train action, now creates an item
|
42
|
+
def train(text, tags = {})
|
43
|
+
debug { "train" }
|
44
|
+
if tags.is_a? Array
|
45
|
+
Item.create(:json => { :text => text, :tags => tags })
|
46
|
+
|
47
|
+
elsif tags.is_a? Hash
|
48
|
+
Item.create(:json => { :text => text, :tag_sets => tags })
|
49
|
+
|
50
|
+
else
|
51
|
+
raise "Ingenia::Api.train(text, tags) must be called with tags argument as either an Array or a Hash"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Find similar items
|
56
|
+
def similar_to( params = {} )
|
57
|
+
debug { "similar_to" }
|
58
|
+
|
59
|
+
initialize_params params
|
60
|
+
|
61
|
+
if params.has_key? :text
|
62
|
+
verify_response { Remote.post("/similar_to_text", @params ) }
|
63
|
+
elsif params.has_key? :tag_ids
|
64
|
+
verify_response { Remote.get("/similar_to_tags", @params ) }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Summarize some text
|
69
|
+
def summarize(params = {})
|
70
|
+
debug { "summarize" }
|
71
|
+
initialize_params params
|
72
|
+
|
73
|
+
verify_response { Remote.post("/summarise", @params ) }
|
74
|
+
end
|
75
|
+
|
76
|
+
def trained_tags
|
77
|
+
debug { "trained_tags" }
|
78
|
+
verify_response { Remote.get('/learnt_tags', :api_key => api_key) }
|
79
|
+
end
|
80
|
+
|
81
|
+
def endpoint=(ep)
|
82
|
+
debug { "endpoint=#{Remote.endpoint}" }
|
83
|
+
Remote.endpoint = ep
|
84
|
+
end
|
85
|
+
|
86
|
+
def version=(v)
|
87
|
+
debug { "version=#{Remote.version}" }
|
88
|
+
Remote.version = v
|
89
|
+
end
|
90
|
+
|
91
|
+
def api_key=(k)
|
92
|
+
debug { "api_key=#{k}" }
|
93
|
+
@api_key = k
|
94
|
+
end
|
95
|
+
|
96
|
+
def api_key
|
97
|
+
raise 'Ingenia::Api.api_key not set' if @api_key.nil?
|
98
|
+
@api_key
|
99
|
+
end
|
100
|
+
|
101
|
+
def debug=(dbg)
|
102
|
+
@debug = dbg
|
103
|
+
debug { "debug is on" }
|
104
|
+
end
|
105
|
+
|
106
|
+
def verify_response
|
107
|
+
output = yield
|
108
|
+
|
109
|
+
return output['data'] unless output['data'].nil?
|
110
|
+
|
111
|
+
raise CallFailed.new( output )
|
112
|
+
end
|
113
|
+
|
114
|
+
private
|
115
|
+
|
116
|
+
|
117
|
+
def self.initialize_params( params = {} )
|
118
|
+
@params = { :api_key => Ingenia::Api.api_key }.merge!(params)
|
119
|
+
end
|
120
|
+
|
121
|
+
def debug
|
122
|
+
puts "Ingenia::Api.debug: #{yield}" if @debug
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
end
|