indico 0.2.0 → 0.2.2

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.
data/README.md CHANGED
@@ -1,8 +1,9 @@
1
1
  # IndicoIo-ruby
2
2
 
3
- A Ruby wrapper for indico's APIs.
3
+ A ruby wrapper for the [indico API](http://indico.io).
4
4
 
5
- ## Installation
5
+ Installation
6
+ -------------
6
7
 
7
8
  Add this line to your application's Gemfile:
8
9
 
@@ -10,17 +11,23 @@ Add this line to your application's Gemfile:
10
11
 
11
12
  And then execute:
12
13
 
13
- $ bundle
14
+ $ bundle install
14
15
 
15
16
  Or install it yourself as:
16
17
 
17
18
  $ gem install indico
18
19
 
19
- Documentation
20
+
21
+ API Keys + Setup
22
+ ----------------
23
+ For API key registration and setup, checkout our [quickstart guide](http://docs.indico.io/v2.0/docs/api-keys).
24
+
25
+ Full Documentation
20
26
  ------------
21
- Found [here](http://indico.readme.io/v1.0/docs)
27
+ Detailed documentation and further code examples are available at [indico.reame.io](http://indico.readme.io/v2.0/docs/ruby)
22
28
 
23
- ## Usage
29
+ Examples
30
+ ---------
24
31
 
25
32
  ```ruby
26
33
  > require 'indico'
@@ -45,44 +52,25 @@ Found [here](http://indico.readme.io/v1.0/docs)
45
52
 
46
53
  ```
47
54
 
48
- ###Batch API Access
49
-
50
- If you'd like to use our batch api interface, please check out the [pricing page](https://indico.io/pricing) on our website to find the right plan for you.
51
-
52
- ```ruby
53
- > require 'indico'
54
-
55
- => true
55
+ Batch API
56
+ ---------
56
57
 
57
- > data = ["I believe in capital punishment", "The president is wrong"]
58
+ Each `Indico` method has a corresponding batch method for analyzing many examples with a single request. Simply pass in an array of inputs and receive an array of results in return.
58
59
 
59
- => ["I believe in capital punishment", "The president is wrong"]
60
-
61
- > Indico.batch_political(data, "username", "password")
62
-
63
- => [ {"Libertarian"=>0.3511057701654774, "Liberal"=>0.06709112089656208, "Green"=>0.03830472376983833, "Conservative"=>0.5434983851681222}, {"Libertarian"=>0.08762905907467175, "Liberal"=>0.18965142341591298, "Green"=>0.02612359787701222, "Conservative"=>0.696595919632403}]
64
- ````
65
-
66
- ###Private cloud API Access
67
-
68
- If you're looking to use indico's API for high throughput applications, please check out the [pricing page](https://indico.io/pricing) on our website to find the right plan for you.
69
60
 
70
61
  ```ruby
71
62
  > require 'indico'
72
63
 
73
64
  => true
74
65
 
75
- > data = ["I believe in capital punishment", "The president is wrong"]
66
+ > Indico.api_key = "YOUR_API_KEY"
76
67
 
77
- => ["I believe in capital punishment", "The president is wrong"]
68
+ => "YOUR_API_KEY"
78
69
 
79
- > Indico.batch_political(data, "username", "password", cloud)
80
-
81
- => [ {"Libertarian"=>0.3511057701654774, "Liberal"=>0.06709112089656208, "Green"=>0.03830472376983833, "Conservative"=>0.5434983851681222}, {"Libertarian"=>0.08762905907467175, "Liberal"=>0.18965142341591298, "Green"=>0.02612359787701222, "Conservative"=>0.696595919632403}]
82
- ````
83
-
84
- The `cloud` parameter redirects API calls to your private cloud hosted at `[cloud].indico.domains`
70
+ > Indico.batch_sentiment(['Best day ever', 'Worst day ever'])
85
71
 
72
+ => [0.9899001220871786, 0.005709885173415242]
73
+ ```
86
74
 
87
75
  ## Contributing
88
76
 
data/Rakefile CHANGED
@@ -1,2 +1 @@
1
- require "bundler/gem_tasks"
2
-
1
+ require 'bundler/gem_tasks'
data/indico.gemspec CHANGED
@@ -4,21 +4,23 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'indico/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "indico"
7
+ spec.name = 'indico'
8
8
  spec.version = Indico::VERSION
9
- spec.authors = ["Slater Victoroff", "Amit Ambardekar"]
10
- spec.email = ["slater@indico.io", "amitamb@gmail.com"]
11
- spec.summary = %q{A simple Ruby Wrapper for the indico set of APIs.}
12
- spec.description = %q{A simple Ruby Wrapper for the indico set of APIs.}
13
- spec.homepage = "https://github.com/IndicoDataSolutions/IndicoIo-ruby"
14
- spec.license = "MIT"
9
+ spec.authors = ['Slater Victoroff', 'Amit Ambardekar', 'Madison May', 'Annie Carlson']
10
+ spec.email = ['slater@indico.io', 'amitamb@gmail.com', 'madison@indico.io', 'annie@indico.io']
11
+ spec.summary = 'A simple Ruby Wrapper for the indico set of APIs.'
12
+ spec.description = 'A simple Ruby Wrapper for the indico set of APIs.'
13
+ spec.homepage = 'https://github.com/IndicoDataSolutions/IndicoIo-ruby'
14
+ spec.license = 'MIT'
15
15
 
16
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"]
17
+ spec.executables = spec.files.grep('^bin\\/') { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep('^(test|spec|features)\\/')
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_runtime_dependency 'inifile', '~> 3.0.0'
22
+ spec.add_development_dependency 'bundler', '~> 1.6'
23
+ spec.add_development_dependency 'rake'
24
+ spec.add_development_dependency 'rspec'
20
25
 
21
- spec.add_development_dependency "bundler", "~> 1.6"
22
- spec.add_development_dependency "rake"
23
- spec.add_development_dependency "rspec"
24
26
  end
data/lib/indico/helper.rb CHANGED
@@ -1,30 +1,44 @@
1
- require "base64"
1
+ require 'base64'
2
2
 
3
3
  module Indico
4
4
  private
5
5
 
6
6
  def self.url_join(root, api)
7
- if root.nil?
8
- "http://apiv1.indico.io/%s" % api
7
+ if !root
8
+ 'http://apiv2.indico.io/' + api
9
9
  else
10
- "http://" + root + ".indico.domains/" + api
10
+ Indico.cloud_protocol + root + '.indico.domains/' + api
11
11
  end
12
12
  end
13
13
 
14
- def self.api_handler(data, server, api, username=nil, password=nil)
14
+ def self.api_handler(data, api, config)
15
+ server = nil
16
+ api_key = nil
17
+ unless config.nil?
18
+ server = config[:cloud]
19
+ api_key = config[:api_key]
20
+ end
15
21
  d = {}
16
22
  d['data'] = data
17
23
  data_dict = JSON.dump(d)
18
- if username.nil?
19
- response = make_request(url_join(server, api), data_dict, HEADERS)
20
- else
21
- response = make_request(url_join(server, api), data_dict, encode_credentials(username, password))
24
+
25
+ if api_key.nil?
26
+ api_key = Indico.config['auth']
27
+ end
28
+
29
+ if server.nil?
30
+ server = Indico.config['cloud']
22
31
  end
32
+
33
+ response = make_request(url_join(server, api), data_dict,
34
+ add_api_key_to_header(api_key))
35
+
36
+
23
37
  results = JSON.parse(response.body)
24
- if results.key?("error")
25
- raise results["error"]
38
+ if results.key?('error')
39
+ fail results['error']
26
40
  else
27
- results = results["results"]
41
+ results['results']
28
42
  end
29
43
  end
30
44
 
@@ -43,11 +57,12 @@ module Indico
43
57
  http.request(request)
44
58
  end
45
59
 
46
- def self.encode_credentials(username, password)
47
- headers = { "Content-Type" => "application/json", "Accept" => "text/plain" }
48
- credentials = username + ":" + password
49
- headers["Authorization"] = "Basic " + Base64.strict_encode64(credentials)
60
+ def self.add_api_key_to_header(api_key)
61
+ if api_key.nil?
62
+ raise ArgumentError, 'api key is required'
63
+ end
64
+ headers = { 'Content-Type' => 'application/json', 'Accept' => 'text/plain' }
65
+ headers['X-ApiKey'] = api_key
50
66
  headers
51
67
  end
52
-
53
68
  end
@@ -0,0 +1,93 @@
1
+ require 'inifile'
2
+
3
+ module Indico
4
+ private
5
+
6
+ class << self; attr_accessor :config; end
7
+ class << self; attr_accessor :cloud_protocol; end
8
+
9
+ Indico.cloud_protocol = 'https://'
10
+
11
+ def self.valid_auth(config)
12
+ # Does a config hashmap have a valid auth definition?
13
+ return config['auth'] &&
14
+ config['auth']['api_key']
15
+ end
16
+
17
+ def self.valid_cloud(config)
18
+ # Does a config hashmap have a valid private cloud definition?
19
+ return config['private_cloud'] &&
20
+ config['private_cloud']['cloud']
21
+ end
22
+
23
+ def self.merge_config(prev_config, new_config)
24
+ # Merge two configurations, giving precedence to the second
25
+ if self.valid_auth(new_config)
26
+ prev_config['auth'] = new_config['auth']
27
+ end
28
+
29
+ if self.valid_cloud(new_config)
30
+ prev_config['private_cloud'] = new_config['private_cloud']
31
+ end
32
+
33
+ return prev_config
34
+ end
35
+
36
+ def self.load_config_files(filenames)
37
+ # Given a list of filenames, build up an ini file config
38
+ master_ini = self.new_config()
39
+
40
+ for filename in filenames
41
+ ini = IniFile.load(filename)
42
+ if not ini then
43
+ next
44
+ end
45
+ master_ini = self.merge_config(master_ini, ini)
46
+ end
47
+ return master_ini
48
+ end
49
+
50
+ def self.find_config_files()
51
+ # Provides a list of paths to search for indicorc files
52
+ localPath = File.join(Dir.pwd, ".indicorc")
53
+ globalPath = File.join(Dir.home, ".indicorc")
54
+ return [globalPath, localPath]
55
+ end
56
+
57
+ def self.load_environment_vars()
58
+ # Load environment variables into same format as INI file reader
59
+ return {'auth' => {'api_key' => ENV["INDICO_API_KEY"]},
60
+ 'private_cloud' => {'cloud' => ENV["INDICO_CLOUD"]}}
61
+ end
62
+
63
+ def self.new_config()
64
+ # Makes a new, empty config object
65
+ new_config = Hash.new
66
+ new_config['auth'] = false
67
+ new_config['cloud'] = false
68
+ return new_config
69
+ end
70
+
71
+ def self.simplify_config(config)
72
+ # Goes from nested representation to flatter version
73
+ new_config = self.new_config()
74
+ if self.valid_auth(config)
75
+ new_config['auth'] = config['auth']['api_key']
76
+ end
77
+ if self.valid_cloud(config)
78
+ new_config['cloud'] = config['private_cloud']['cloud']
79
+ end
80
+ return new_config
81
+ end
82
+
83
+ def self.load_config()
84
+ # Finds, loads, and simplifies all configuration types
85
+ paths = self.find_config_files()
86
+ config_file = self.load_config_files(paths)
87
+ env_vars = self.load_environment_vars()
88
+ config = self.merge_config(config_file, env_vars)
89
+ return self.simplify_config(config)
90
+ end
91
+ end
92
+
93
+ Indico.config = Indico.load_config()
@@ -1,3 +1,3 @@
1
1
  module Indico
2
- VERSION = "0.2.0"
2
+ VERSION = '0.2.2'
3
3
  end
data/lib/indico.rb CHANGED
@@ -1,75 +1,90 @@
1
- require "indico/version"
2
- require "indico/helper"
3
- require "uri"
4
- require "json"
5
- require "net/https"
1
+ require 'indico/version'
2
+ require 'indico/helper'
3
+ require 'indico/settings'
4
+ require 'uri'
5
+ require 'json'
6
+ require 'net/https'
6
7
 
7
8
  module Indico
9
+ HEADERS = { 'Content-Type' => 'application/json', 'Accept' => 'text/plain' }
8
10
 
9
- HEADERS = { "Content-Type" => "application/json", "Accept" => "text/plain" }
11
+ def self.api_key
12
+ config['auth']
13
+ end
14
+
15
+ def self.api_key=(api)
16
+ config['auth'] = api
17
+ end
18
+
19
+ def self.private_cloud
20
+ config['cloud']
21
+ end
22
+
23
+ def self.private_cloud=(cloud)
24
+ config['cloud'] = cloud
25
+ end
10
26
 
11
- def self.political(test_text, username=nil, password=nil, private_cloud=nil)
12
- api_handler(test_text, private_cloud, "political", username, password)
27
+ def self.political(test_text, config = nil)
28
+ api_handler(test_text, 'political', config)
13
29
  end
14
30
 
15
- def self.batch_political(test_text, username, password, private_cloud=nil)
16
- api_handler(test_text, private_cloud, "political/batch", username, password)
31
+ def self.batch_political(test_text, config = nil)
32
+ api_handler(test_text, 'political/batch', config)
17
33
  end
18
34
 
19
- def self.posneg(test_text, username=nil, password=nil, private_cloud=nil)
20
- api_handler(test_text, private_cloud, "sentiment", username, password)
35
+ def self.posneg(test_text, config = nil)
36
+ api_handler(test_text, 'sentiment', config)
21
37
  end
22
38
 
23
- def self.batch_posneg(test_text, username, password, private_cloud=nil)
24
- api_handler(test_text, private_cloud, "sentiment/batch", username, password)
39
+ def self.batch_posneg(test_text, config = nil)
40
+ api_handler(test_text, 'sentiment/batch', config)
25
41
  end
26
42
 
27
43
  def self.sentiment(*args)
28
- self.posneg(*args)
44
+ posneg(*args)
29
45
  end
30
46
 
31
47
  def self.batch_sentiment(*args)
32
- self.batch_posneg(*args)
48
+ batch_posneg(*args)
33
49
  end
34
50
 
35
- def self.language(test_text, username=nil, password=nil, private_cloud=nil)
36
- api_handler(test_text, private_cloud, "language", username, password)
51
+ def self.language(test_text, config = nil)
52
+ api_handler(test_text, 'language', config)
37
53
  end
38
54
 
39
- def self.batch_language(test_text, username, password, private_cloud=nil)
40
- api_handler(test_text, private_cloud, "language/batch", username, password)
55
+ def self.batch_language(test_text, config = nil)
56
+ api_handler(test_text, 'language/batch', config)
41
57
  end
42
58
 
43
- def self.text_tags(test_text, username=nil, password=nil, private_cloud=nil)
44
- api_handler(test_text, private_cloud, "texttags", username, password)
59
+ def self.text_tags(test_text, config = nil)
60
+ api_handler(test_text, 'texttags', config)
45
61
  end
46
62
 
47
- def self.batch_text_tags(test_text, username, password, private_cloud=nil)
48
- api_handler(test_text, private_cloud, "texttags/batch", username, password)
63
+ def self.batch_text_tags(test_text, config = nil)
64
+ api_handler(test_text, 'texttags/batch', config)
49
65
  end
50
66
 
51
- def self.fer(face, username=nil, password=nil, private_cloud=nil)
52
- api_handler(face, private_cloud, "fer", username, password)
67
+ def self.fer(face, config = nil)
68
+ api_handler(face, 'fer', config)
53
69
  end
54
70
 
55
- def self.batch_fer(test_text, username, password, private_cloud=nil)
56
- api_handler(test_text, private_cloud, "fer/batch", username, password)
71
+ def self.batch_fer(test_text, config = nil)
72
+ api_handler(test_text, 'fer/batch', config)
57
73
  end
58
74
 
59
- def self.facial_features(face, username=nil, password=nil, private_cloud=nil)
60
- api_handler(face, private_cloud, "facialfeatures", username, password)
75
+ def self.facial_features(face, config = nil)
76
+ api_handler(face, 'facialfeatures', config)
61
77
  end
62
78
 
63
- def self.batch_facial_features(test_text, username, password, private_cloud=nil)
64
- api_handler(test_text, private_cloud, "facialfeatures/batch", username, password)
79
+ def self.batch_facial_features(test_text, config = nil)
80
+ api_handler(test_text, 'facialfeatures/batch', config)
65
81
  end
66
82
 
67
- def self.image_features(face, username=nil, password=nil, private_cloud=nil)
68
- api_handler(face, private_cloud, "imagefeatures", username, password)
83
+ def self.image_features(face, config = nil)
84
+ api_handler(face, 'imagefeatures', config)
69
85
  end
70
86
 
71
- def self.batch_image_features(test_text, username, password, private_cloud=nil)
72
- api_handler(test_text, private_cloud, "imagefeatures/batch", username, password)
87
+ def self.batch_image_features(test_text, config = nil)
88
+ api_handler(test_text, 'imagefeatures/batch', config)
73
89
  end
74
-
75
90
  end
@@ -0,0 +1,5 @@
1
+ [auth]
2
+ api_key=testapikey
3
+
4
+ [private_cloud]
5
+ cloud=testcloud
@@ -0,0 +1,2 @@
1
+ [auth]
2
+ api_key=testapikey
@@ -1,37 +1,42 @@
1
1
  require 'spec_helper'
2
2
  require 'set'
3
3
 
4
- $username = ENV['INDICO_USERNAME']
5
- $password = ENV['INDICO_PASSWORD']
6
- $private_cloud = 'indico-test'
7
-
8
4
  describe Indico do
5
+ before do
6
+ api_key = ENV['INDICO_API_KEY']
7
+ private_cloud = 'indico-test'
8
+ @config_private_cloud = { api_key: api_key, cloud: private_cloud}
9
+ @config = { api_key: api_key}
10
+ end
9
11
 
10
- it "should tag text with correct political tags" do
11
- expected_keys = Set.new(["Conservative", "Green", "Liberal", "Libertarian"])
12
- data = ["Guns don't kill people."," People kill people."]
13
- response = Indico.batch_political(data, $username, $password) # Guns don't kill people. People kill people.
12
+ it 'should tag text with correct political tags' do
13
+ expected_keys = Set.new(%w(Conservative Green Liberal Libertarian))
14
+ data = ['Guns don\'t kill people.', ' People kill people.']
15
+ response = Indico.batch_political(data, @config)
14
16
 
15
17
  expect(Set.new(response[0].keys)).to eql(expected_keys)
16
18
  expect(Set.new(response[1].keys)).to eql(expected_keys)
17
19
  end
18
20
 
19
- it "should access a private cloud" do
20
- expected_keys = Set.new(["Conservative", "Green", "Liberal", "Libertarian"])
21
- data = ["Guns don't kill people."," People kill people."]
22
- response = Indico.batch_political(data, $username, $password, $private_cloud) # Guns don't kill people. People kill people.
21
+ it 'should access a private cloud' do
22
+ expected_keys = Set.new(%w(Conservative Green Liberal Libertarian))
23
+ data = ['Guns don\'t kill people.', ' People kill people.']
24
+
25
+ # for mocking: use http instead of https to route requests to our public cloud
26
+ Indico.cloud_protocol = 'http://'
27
+ response = Indico.batch_political(data, @config_private_cloud)
28
+ Indico.cloud_protocol = 'https://'
23
29
 
24
30
  expect(Set.new(response[0].keys)).to eql(expected_keys)
25
31
  expect(Set.new(response[1].keys)).to eql(expected_keys)
26
32
  end
27
33
 
28
- it "should tag text with correct sentiment tags" do
29
- response = Indico.batch_sentiment(["Worst movie ever."], $username, $password)
30
-
34
+ it 'should tag text with correct sentiment tags' do
35
+ response = Indico.batch_sentiment(['Worst movie ever.'], @config)
31
36
  expect(response[0] < 0.5).to eql(true)
32
37
  end
33
38
 
34
- it "should tag text with correct language tags" do
39
+ it 'should tag text with correct language tags' do
35
40
  expected_keys = Set.new([
36
41
  'English',
37
42
  'Spanish',
@@ -70,64 +75,63 @@ describe Indico do
70
75
  ])
71
76
 
72
77
  data = ['Quis custodiet ipsos custodes', 'Clearly english, foo!']
73
- response = Indico.batch_language(data, $username, $password)
78
+ response = Indico.batch_language(data, @config)
74
79
 
75
80
  expect(Set.new(response[0].keys)).to eql(expected_keys)
76
81
  expect(Set.new(response[1].keys)).to eql(expected_keys)
77
82
  end
78
83
 
79
- it "should tag text with correct text tags" do
80
- expected_keys = Set.new(['fashion', 'art', 'energy', 'economics', 'entrepreneur',
81
- 'books', 'politics', 'gardening', 'nba', 'conservative',
82
- 'technology', 'startups', 'relationships', 'education',
83
- 'humor', 'psychology', 'bicycling', 'investing', 'travel',
84
- 'cooking', 'christianity', 'environment', 'religion', 'health',
85
- 'hockey', 'pets', 'music', 'soccer', 'guns', 'gaming', 'jobs',
86
- 'business', 'nature', 'food', 'cars', 'photography', 'philosophy',
87
- 'geek', 'sports', 'baseball', 'news', 'television', 'entertainment',
88
- 'parenting', 'comics', 'science', 'nfl','programming',
89
- 'personalfinance', 'atheism', 'movies', 'anime', 'fitness',
90
- 'military', 'realestate', 'history'])
91
-
92
- data = ["Guns don't kill people.", "People kill people."]
93
- response = Indico.batch_text_tags(data, $username, $password) # Guns don't kill people. People kill people.
84
+ it 'should tag text with correct text tags' do
85
+ expected_keys = Set.new(%w(fashion art energy economics entrepreneur
86
+ books politics gardening nba conservative
87
+ technology startups relationships education
88
+ humor psychology bicycling investing travel
89
+ cooking christianity environment religion health
90
+ hockey pets music soccer guns gaming jobs
91
+ business nature food cars photography philosophy
92
+ geek sports baseball news television
93
+ entertainment parenting comics science nfl
94
+ programming personalfinance atheism movies anime
95
+ fitness military realestate history))
96
+
97
+ data = ['Guns don\'t kill people.', 'People kill people.']
98
+ response = Indico.batch_text_tags(data, @config)
94
99
 
95
100
  expect Set.new(response[0].keys).subset?(Set.new(expected_keys))
96
101
  expect Set.new(response[1].keys).subset?(Set.new(expected_keys))
97
102
  end
98
103
 
99
- it "should tag face with correct facial expression" do
100
- expected_keys = Set.new(["Angry", "Sad", "Neutral", "Surprise", "Fear", "Happy"])
101
- test_face = Array.new(48){Array.new(48){rand(100)/100.0} }
102
- response = Indico.batch_fer([test_face, test_face], $username, $password)
104
+ it 'should tag face with correct facial expression' do
105
+ expected_keys = Set.new(%w(Angry Sad Neutral Surprise Fear Happy))
106
+ test_face = Array.new(48) { Array.new(48) { rand(100) / 100.0 } }
107
+ response = Indico.batch_fer([test_face, test_face], @config)
103
108
 
104
109
  expect(Set.new(response[0].keys)).to eql(expected_keys)
105
110
  expect(Set.new(response[1].keys)).to eql(expected_keys)
106
111
  end
107
112
 
108
- it "should tag face with correct facial features" do
109
- test_face = Array.new(48){Array.new(48){rand(100)/100.0} }
110
- response = Indico.batch_facial_features([test_face, test_face], $username, $password)
111
-
113
+ it 'should tag face with correct facial features' do
114
+ test_face = Array.new(48) { Array.new(48) { rand(100) / 100.0 } }
115
+ response = Indico.batch_facial_features([test_face, test_face], @config)
112
116
  expect(response[0].length).to eql(48)
113
117
  expect(response[1].length).to eql(48)
114
118
  end
115
119
 
116
- it "should tag image with correct image features" do
117
- test_image = Array.new(48){Array.new(48){rand(100)/100.0} }
118
- response = Indico.batch_image_features([test_image, test_image], $username, $password)
119
-
120
+ it 'should tag image with correct image features' do
121
+ test_image = Array.new(48) { Array.new(48) { rand(100) / 100.0 } }
122
+ response = Indico.batch_image_features([test_image, test_image], @config)
120
123
  expect(response[0].length).to eql(2048)
121
124
  expect(response[1].length).to eql(2048)
122
125
  end
123
126
 
124
127
  # Uncomment when frontend updated to accept image urls
125
128
  # it "should accept image urls" do
126
- # test_image = "http://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/48/Emotes-face-smile-icon.png"
127
- # response = Indico.batch_image_features([test_image, test_image], $username, $password)
129
+ # test_image = 'http://icons.iconarchive.com/icons/oxygen-icons.org/' +
130
+ # 'oxygen/48/Emotes-face-smile-icon.png'
131
+ # response = Indico.batch_image_features([test_image, test_image],
132
+ # @config)
128
133
 
129
134
  # expect(response[0].length).to eql(2048)
130
135
  # expect(response[1].length).to eql(2048)
131
136
  # end
132
-
133
137
  end
data/spec/indico_spec.rb CHANGED
@@ -1,34 +1,38 @@
1
1
  require 'spec_helper'
2
2
  require 'set'
3
3
 
4
- $username = ENV['INDICO_USERNAME']
5
- $password = ENV['INDICO_PASSWORD']
6
- $private_cloud = 'indico-test'
7
-
8
4
  describe Indico do
5
+ before do
6
+ api_key = ENV['INDICO_API_KEY']
7
+ private_cloud = 'indico-test'
8
+ @config = { api_key: api_key, cloud: private_cloud}
9
+ end
9
10
 
10
- it "should tag text with correct political tags" do
11
- expected_keys = Set.new(["Conservative", "Green", "Liberal", "Libertarian"])
12
- response = Indico.political("Guns don't kill people. People kill people.") # Guns don't kill people. People kill people.
11
+ it 'should tag text with correct political tags' do
12
+ expected_keys = Set.new(%w(Conservative Green Liberal Libertarian))
13
+ response = Indico.political('Guns don\'t kill people. People kill people.')
13
14
 
14
15
  expect(Set.new(response.keys)).to eql(expected_keys)
15
16
  end
16
17
 
17
- it "should tag text with correct political tags" do
18
- expected_keys = Set.new(["Conservative", "Green", "Liberal", "Libertarian"])
19
- data = "Guns don't kill people. People kill people."
20
- response = Indico.political(data, $username, $password, $private_cloud) # Guns don't kill people. People kill people.
21
-
18
+ it 'should tag text with correct political tags' do
19
+ expected_keys = Set.new(%w(Conservative Green Liberal Libertarian))
20
+ data = 'Guns don\'t kill people. People kill people.'
21
+
22
+ # for mocking: use http to redirect requests to our public cloud endpoint
23
+ Indico.cloud_protocol = 'http://'
24
+ response = Indico.political(data, @config)
25
+ Indico.cloud_protocol = 'https://'
22
26
  expect(Set.new(response.keys)).to eql(expected_keys)
23
27
  end
24
28
 
25
- it "should tag text with correct sentiment tags" do
26
- response = Indico.sentiment("Worst movie ever.")
29
+ it 'should tag text with correct sentiment tags' do
30
+ response = Indico.sentiment('Worst movie ever.')
27
31
 
28
32
  expect(response < 0.5).to eql(true)
29
33
  end
30
34
 
31
- it "should tag text with correct language tags" do
35
+ it 'should tag text with correct language tags' do
32
36
  expected_keys = Set.new([
33
37
  'English',
34
38
  'Spanish',
@@ -70,51 +74,59 @@ describe Indico do
70
74
  expect(Set.new(response.keys)).to eql(expected_keys)
71
75
  end
72
76
 
73
- it "should tag text with correct text tags" do
74
- expected_keys = Set.new(['fashion', 'art', 'energy', 'economics', 'entrepreneur',
75
- 'books', 'politics', 'gardening', 'nba', 'conservative',
76
- 'technology', 'startups', 'relationships', 'education',
77
- 'humor', 'psychology', 'bicycling', 'investing', 'travel',
78
- 'cooking', 'christianity', 'environment', 'religion', 'health',
79
- 'hockey', 'pets', 'music', 'soccer', 'guns', 'gaming', 'jobs',
80
- 'business', 'nature', 'food', 'cars', 'photography', 'philosophy',
81
- 'geek', 'sports', 'baseball', 'news', 'television', 'entertainment',
82
- 'parenting', 'comics', 'science', 'nfl','programming',
83
- 'personalfinance', 'atheism', 'movies', 'anime', 'fitness',
84
- 'military', 'realestate', 'history'])
85
- response = Indico.text_tags("Guns don't kill people. People kill people.") # Guns don't kill people. People kill people.
77
+ it 'should tag text with correct text tags' do
78
+ expected_keys = Set.new(%w(fashion art energy economics entrepreneur
79
+ books politics gardening nba conservative
80
+ technology startups relationships education
81
+ humor psychology bicycling investing travel
82
+ cooking christianity environment religion health
83
+ hockey pets music soccer guns gaming jobs
84
+ business nature food cars photography philosophy
85
+ geek sports baseball news television
86
+ entertainment parenting comics science nfl
87
+ programming personalfinance atheism movies anime
88
+ fitness military realestate history))
89
+ response = Indico.text_tags('Guns don\'t kill people. People kill people.')
86
90
 
87
91
  expect Set.new(response.keys).subset?(Set.new(expected_keys))
88
92
  end
89
93
 
90
- it "should tag face with correct facial expression" do
91
- expected_keys = Set.new(["Angry", "Sad", "Neutral", "Surprise", "Fear", "Happy"])
92
- test_face = Array.new(48){Array.new(48){rand(100)/100.0} }
94
+ it 'should tag face with correct facial expression' do
95
+ expected_keys = Set.new(%w(Angry Sad Neutral Surprise Fear Happy))
96
+ test_face = Array.new(48) { Array.new(48) { rand(100) / 100.0 } }
93
97
 
94
98
  response = Indico.fer(test_face)
95
99
 
96
100
  expect(Set.new(response.keys)).to eql(expected_keys)
97
101
  end
98
102
 
99
- it "should tag face with correct facial features" do
100
- test_face = Array.new(48){Array.new(48){rand(100)/100.0} }
103
+ it 'should tag face with correct facial features' do
104
+ test_face = Array.new(48) { Array.new(48) { rand(100) / 100.0 } }
101
105
  response = Indico.facial_features(test_face)
102
106
 
103
107
  expect(response.length).to eql(48)
104
108
  end
105
109
 
106
- it "should tag image with correct image features" do
107
- test_image = Array.new(48){Array.new(48){rand(100)/100.0} }
110
+ it 'should tag image with correct image features' do
111
+ test_image = Array.new(48) { Array.new(48) { rand(100) / 100.0 } }
112
+ response = Indico.image_features(test_image)
113
+
114
+ expect(response.length).to eql(2048)
115
+ end
116
+
117
+ it "should tag rgb image with correct image features" do
118
+ test_image = Array.new(48){Array.new(48){Array.new(3){rand(100)/100.0}}}
108
119
  response = Indico.image_features(test_image)
109
120
 
110
121
  expect(response.length).to eql(2048)
111
122
  end
112
123
 
113
124
  # Uncomment when frontend updated to accept image urls
114
- # it "should accept image urls" do
115
- # response = Indico.image_features("http://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/48/Emotes-face-smile-icon.png")
125
+ # it 'should accept image urls' do
126
+ # response = Indico.image_features('http://icons.iconarchive.com/icons/' +
127
+ # 'oxygen-icons.org/oxygen/48/' +
128
+ # 'Emotes-face-smile-icon.png')
116
129
 
117
130
  # expect(response.length).to eql(2048)
118
131
  # end
119
-
120
132
  end
@@ -0,0 +1,95 @@
1
+ require 'spec_helper'
2
+
3
+ describe Indico do
4
+ it 'should correctly parse an ini file without raising an error' do
5
+ Indico.load_config_files(Indico.find_config_files())
6
+ end
7
+
8
+ it 'should find the correct config files' do
9
+ files = Indico.find_config_files()
10
+ expect(files[0]).to eql("#{Dir.home}/.indicorc")
11
+ expect(files[1]).to eql("#{Dir.pwd}/.indicorc")
12
+ end
13
+
14
+ it 'should read in config files properly' do
15
+ files = [
16
+ File.expand_path('../config/.indicorc.test', __FILE__),
17
+ File.expand_path('../config/.indicorc.test.2', __FILE__)
18
+ ]
19
+ config = Indico.load_config_files(files)
20
+ expected_auth = Hash.new
21
+ expected_auth['api_key'] = 'testapikey'
22
+ expect(config['auth']).to eql(expected_auth)
23
+ end
24
+
25
+ it 'should read in variables from the user\'s environment' do
26
+ api_key = 'testapikey'
27
+ cloud = 'cloud'
28
+ ENV['INDICO_API_KEY'] = api_key
29
+ ENV['INDICO_CLOUD'] = cloud
30
+
31
+ config = Indico.load_environment_vars()
32
+ expected_auth = Hash.new
33
+ expected_auth['api_key'] = 'testapikey'
34
+
35
+ expected_cloud = Hash.new
36
+ expected_cloud['cloud'] = cloud
37
+
38
+ expect(config['auth']).to eql(expected_auth)
39
+ expect(config['private_cloud']).to eql(expected_cloud)
40
+ end
41
+
42
+ it 'should combine file and env variable configuration' do
43
+ api_key = 'testapikey'
44
+ cloud = 'cloud'
45
+ ENV['INDICO_API_KEY'] = api_key
46
+ ENV['INDICO_CLOUD'] = cloud
47
+
48
+ expected = Hash.new
49
+ expected['auth'] = api_key
50
+ expected['cloud'] = cloud
51
+
52
+ config = Indico.load_config()
53
+ expect(config).to eql(expected)
54
+ end
55
+
56
+ it 'should merge configurations properly' do
57
+
58
+ file_api_key = 'file-api-key'
59
+ file_cloud = 'file-cloud'
60
+ file_config = Hash.new
61
+ file_config['auth'] = Hash.new
62
+ file_config['private_cloud'] = Hash.new
63
+ file_config['auth']['api_key'] = file_api_key
64
+ file_config['private_cloud']['cloud'] = file_cloud
65
+
66
+ env_api_key = 'env-api-key'
67
+ env_cloud = 'env-cloud'
68
+ ENV['INDICO_API_KEY'] = env_api_key
69
+ ENV['INDICO_CLOUD'] = env_cloud
70
+
71
+ env_config = Indico.load_environment_vars()
72
+ merged = Indico.merge_config(file_config, env_config)
73
+ expect(merged['auth']['api_key']).to eql(env_api_key)
74
+ expect(merged['private_cloud']['cloud']).to eql(env_cloud)
75
+ end
76
+
77
+ it 'should set api key with a call to set_api_key' do
78
+ Indico.api_key = nil
79
+ begin
80
+ Indico.political('Guns don\'t kill people. People kill people.')
81
+ rescue ArgumentError => exception
82
+ expect(exception.message).to eql('api key is required')
83
+ else
84
+ fail('api_key was not null')
85
+ end
86
+
87
+ begin
88
+ Indico.political('Guns don\'t kill people. People kill people.')
89
+ rescue ArgumentError => exception
90
+ expect(exception.message).to eql('api key is required')
91
+ else
92
+ fail('api_key was not null')
93
+ end
94
+ end
95
+ end
data/spec/spec_helper.rb CHANGED
@@ -2,7 +2,7 @@ require 'indico'
2
2
 
3
3
  # This file was generated by the `rspec --init` command. Conventionally, all
4
4
  # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
5
- # The generated `.rspec` file contains `--require spec_helper` which will cause this
5
+ # The generated `.rspec` file contains `--require spec_helper` which causes this
6
6
  # file to always be loaded, without a need to explicitly require it in any files.
7
7
  #
8
8
  # Given that it is always loaded, you are encouraged to keep this file as
metadata CHANGED
@@ -1,17 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: indico
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Slater Victoroff
9
9
  - Amit Ambardekar
10
+ - Madison May
11
+ - Annie Carlson
10
12
  autorequire:
11
13
  bindir: bin
12
14
  cert_chain: []
13
- date: 2015-03-20 00:00:00.000000000 Z
15
+ date: 2015-04-08 00:00:00.000000000 Z
14
16
  dependencies:
17
+ - !ruby/object:Gem::Dependency
18
+ name: inifile
19
+ requirement: !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ~>
23
+ - !ruby/object:Gem::Version
24
+ version: 3.0.0
25
+ type: :runtime
26
+ prerelease: false
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 3.0.0
15
33
  - !ruby/object:Gem::Dependency
16
34
  name: bundler
17
35
  requirement: !ruby/object:Gem::Requirement
@@ -64,6 +82,8 @@ description: A simple Ruby Wrapper for the indico set of APIs.
64
82
  email:
65
83
  - slater@indico.io
66
84
  - amitamb@gmail.com
85
+ - madison@indico.io
86
+ - annie@indico.io
67
87
  executables: []
68
88
  extensions: []
69
89
  extra_rdoc_files: []
@@ -77,9 +97,13 @@ files:
77
97
  - indico.gemspec
78
98
  - lib/indico.rb
79
99
  - lib/indico/helper.rb
100
+ - lib/indico/settings.rb
80
101
  - lib/indico/version.rb
102
+ - spec/config/.indicorc.test
103
+ - spec/config/.indicorc.test.2
81
104
  - spec/indico_batch_spec.rb
82
105
  - spec/indico_spec.rb
106
+ - spec/settings_spec.rb
83
107
  - spec/spec_helper.rb
84
108
  homepage: https://github.com/IndicoDataSolutions/IndicoIo-ruby
85
109
  licenses:
@@ -106,7 +130,4 @@ rubygems_version: 1.8.23
106
130
  signing_key:
107
131
  specification_version: 3
108
132
  summary: A simple Ruby Wrapper for the indico set of APIs.
109
- test_files:
110
- - spec/indico_batch_spec.rb
111
- - spec/indico_spec.rb
112
- - spec/spec_helper.rb
133
+ test_files: []