salesforce-einstein 0.0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: bcfa9e092608589daeec4da5d0483e7e87931c90a0e578570d6f6afdfdb316f3
4
+ data.tar.gz: bf5f59464f60b52c023c664d12806ec72c9844432ac41c63e47b4367fe87cdd5
5
+ SHA512:
6
+ metadata.gz: 479bafec87791f8d9055bdbd3b53a5460c2dd576be89e369cb96c500203d17b8d95a18a1be937b58d2c82eb167d5e636a767ba9649e68f7d37af0cfeae0255df
7
+ data.tar.gz: 56b3690d3141eeef15ea6d0264e0a16aa860c186724a5e41b4b504fdf59e2f11f23a85b8ce644a2b6576e48bb69c338dcc4f025bd4b39779223ecf610a92a208
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ /vendor/
11
+ /.idea/
12
+ .byebug_history
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.2.4
5
+ before_install: gem install bundler -v 1.13.1
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ # Specify your gem's dependencies in salesforce-einstein.gemspec
6
+ gemspec
7
+
8
+ gem 'pry'
9
+ gem 'pry-byebug'
10
+ gem 'rubocop'
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Makoto Tajitsu
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,132 @@
1
+ # Salesforce Einstein
2
+
3
+ [![Build Status](https://travis-ci.org/tzmfreedom/salesforce-einstein.svg?branch=master)](https://travis-ci.org/tzmfreedom/salesforce-einstein)
4
+
5
+ API Client for [Salesforce Einstein](https://einstein.ai).
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'salesforce-einstein'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install salesforce-einstein
22
+
23
+ ## Usage
24
+
25
+ - Initialize Client
26
+ ```ruby
27
+ client = Salesforce::Einstein::Client.new(cert: '/path/to/certificate',
28
+ password: 'certificate password',
29
+ email: 'einstein account email')
30
+ ```
31
+ or
32
+ ```ruby
33
+ client = Salesforce::Einstein::Client.new(private_key: '/path/to/private_key',
34
+ password: 'private_key password',
35
+ email: 'einstein account email')
36
+ ```
37
+
38
+ - Prediction with Image URL
39
+ ```ruby
40
+ client.predict_with_url 'url', 'modelId'
41
+ ```
42
+
43
+ - Prediction with Image Base64 String
44
+ ```ruby
45
+ client.predict_with_base64 'base64 string', 'modelId'
46
+ ```
47
+
48
+ - Create a Dataset
49
+ ```ruby
50
+ client.create_dataset 'name', 'labels'
51
+ ```
52
+
53
+ - Get a Dataset
54
+ ```ruby
55
+ client.get_dataset 'dataset_id'
56
+ ```
57
+
58
+ - Get All Datasets
59
+ ```ruby
60
+ client.get_all_datasets
61
+ ```
62
+
63
+ - Delete a Dataset
64
+ ```ruby
65
+ client.delete_dataset 'dataset_id'
66
+ ```
67
+
68
+ - Create a Label
69
+ ```ruby
70
+ client.create_label 'dataset_id', 'name'
71
+ ```
72
+
73
+ - Get a Label
74
+ ```ruby
75
+ client.get_label 'dataset_id', 'label_id'
76
+ ```
77
+
78
+ - Create an Example
79
+ ```ruby
80
+ client.create_example 'dataset_id', params
81
+ ```
82
+
83
+ - Get an Example
84
+ ```ruby
85
+ client.get_example 'dataset_id', 'example_id'
86
+ ```
87
+
88
+ - Get All Examples
89
+ ```ruby
90
+ client.get_all_example 'dataset_id'
91
+ ```
92
+
93
+ - Delete an Example
94
+ ```ruby
95
+ client.delete_example 'dataset_id', 'example_id'
96
+ ```
97
+
98
+ - Train a Dataset
99
+ ```ruby
100
+ client.train_dataset params
101
+ ```
102
+
103
+ - Get Training Status
104
+ ```ruby
105
+ client.get_training_status 'model_id'
106
+ ```
107
+
108
+ - Get Model Metrics
109
+ ```ruby
110
+ client.get_model_metrics 'model_id'
111
+ ```
112
+
113
+ - Get All Models
114
+ ```ruby
115
+ client.get_all_models 'dataset_id'
116
+ ```
117
+
118
+ ## Development
119
+
120
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
121
+
122
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
123
+
124
+ ## Contributing
125
+
126
+ Bug reports and pull requests are welcome on GitHub at https://github.com/tzmfreedom/salesforce-einstein.
127
+
128
+
129
+ ## License
130
+
131
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
132
+
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ task default: :spec
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'salesforce-einstein'
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ require 'irb'
15
+ IRB.start
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'salesforce/einstein/version'
4
+ require 'salesforce/einstein/vision_client'
5
+ require 'salesforce/einstein/language_client'
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'jwt'
4
+ require 'net/https'
5
+ require 'faraday'
6
+ require 'securerandom'
7
+
8
+ module Salesforce
9
+ module Einstein
10
+ class Base
11
+ BASE_URI = 'https://api.einstein.ai/v2'
12
+
13
+ attr_accessor :boundary, :email, :private_key, :access_token, :timeout
14
+
15
+ def initialize(cert: nil, private_key: nil, password: nil, email:, timeout: 3600)
16
+ if cert.nil? && private_key.nil?
17
+ raise ArgumentError, 'At least one parameter must be specified: cert or private_key'
18
+ end
19
+
20
+ if cert
21
+ cert_contents = File.read(File.expand_path(cert))
22
+ pkcs12 = OpenSSL::PKCS12.new(cert_contents, password)
23
+ @private_key = pkcs12.key
24
+ else
25
+ private_key_contents = File.read(File.expand_path(private_key))
26
+ @private_key = OpenSSL::PKey::RSA.new(private_key_contents, password)
27
+ end
28
+ @email = email
29
+ @boundary = SecureRandom.hex(10)
30
+ @timeout = 3600
31
+ end
32
+
33
+ def access_token
34
+ @token_info ||= get_access_token
35
+ @token_info['access_token']
36
+ end
37
+
38
+ def get_api_usage
39
+ get '/apiusage'
40
+ end
41
+
42
+ def delete_reflesh_token(token)
43
+ delete "/oauth2/token/#{token}"
44
+ end
45
+
46
+ private
47
+
48
+ def client
49
+ @client ||= Faraday.new do |conn|
50
+ conn.request :multipart
51
+ conn.request :url_encoded
52
+ conn.adapter :net_http
53
+ end
54
+ end
55
+
56
+ def get(path)
57
+ response = client.get do |req|
58
+ req.url "#{BASE_URI}#{path}"
59
+ req.headers['Authorization'] = "Bearer #{access_token}"
60
+ end
61
+ response ? JSON.parse(response.body) : nil
62
+ end
63
+
64
+ def post(path, params)
65
+ response = client.post do |req|
66
+ req.url "#{BASE_URI}#{path}"
67
+ req.headers['Content-Type'] = 'multipart/form-data'
68
+ req.headers['Authorization'] = "Bearer #{access_token}"
69
+ req.body = params
70
+ end
71
+ response ? JSON.parse(response.body) : nil
72
+ end
73
+
74
+ def delete(path)
75
+ response = client.delete do |req|
76
+ req.url "#{BASE_URI}#{path}"
77
+ req.headers['Content-Type'] = 'multipart/form-data'
78
+ req.headers['Authorization'] = "Bearer #{access_token}"
79
+ end
80
+ response ? JSON.parse(response.body) : nil
81
+ end
82
+
83
+ def get_access_token
84
+ jwt = JWT.encode({
85
+ iss: 'developer.force.com',
86
+ sub: email,
87
+ aud: "#{BASE_URI}/oauth2/token",
88
+ iat: Time.now.to_i,
89
+ exp: Time.now.to_i + timeout
90
+ }, private_key, 'RS256')
91
+
92
+ response = client.post do |req|
93
+ req.url "#{BASE_URI}/oauth2/token"
94
+ req.headers['Content-Type'] = 'application/x-www-form-urlencoded'
95
+ req.body = {
96
+ grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
97
+ assertion: jwt
98
+ }
99
+ end
100
+ response ? JSON.parse(response.body) : nil
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'salesforce/einstein/base'
4
+
5
+ module Salesforce
6
+ module Einstein
7
+ module V2
8
+ class LanguageClient < Salesforce::Einstein::Base
9
+ def predict_for_intent(document:, model_id: 'CommunitySentiment', num_results: nil, sample_id: nil)
10
+ post '/language/intent', document: document, modelId: model_id, numResults: num_results, sampleId: sample_id
11
+ end
12
+
13
+ def predict_for_sentiment(document:, model_id: 'CommunitySentiment', num_results: nil, sample_id: nil)
14
+ post '/language/sentiment', document: document, modelId: model_id, numResults: num_results, sampleId: sample_id
15
+ end
16
+
17
+ def create_dataset(name, labels, type = 'image')
18
+ post '/language/datasets', type: type, name: name, labels: labels
19
+ end
20
+
21
+ def create_dataset_from_file(sync: true, data: nil, name: nil, path: nil, type: 'text-intent')
22
+ params = { name: name, type: type }
23
+ params[:data] = data if data
24
+ params[:path] = path if path
25
+ post "/language/datasets/upload#{sync ? '/sync' : ''}", params
26
+ end
27
+
28
+ def all_datasets
29
+ get '/language/datasets'
30
+ end
31
+
32
+ def dataset(dataset_id)
33
+ get "/language/datasets/#{dataset_id}"
34
+ end
35
+
36
+ def delete_dataset(dataset_id)
37
+ delete "/language/datasets/#{dataset_id}"
38
+ end
39
+
40
+ def deletion_status(deletion_id)
41
+ get "/language/deletion/#{deletion_id}"
42
+ end
43
+
44
+ def create_label(dataset_id, name)
45
+ post "/language/datasets/#{dataset_id}/labels", name: name
46
+ end
47
+
48
+ def label(dataset_id, label_id)
49
+ get "/language/datasets/#{dataset_id}/labels/#{label_id}"
50
+ end
51
+
52
+ def create_example(dataset_id, params)
53
+ post "/language/datasets/#{dataset_id}/examples", params
54
+ end
55
+
56
+ def all_examples(dataset_id)
57
+ get "/language/datasets/#{dataset_id}/examples"
58
+ end
59
+
60
+ def all_examples_for_label(dataset_id, label_id)
61
+ get "/language/datasets/#{dataset_id}/examples?labelId=#{label_id}"
62
+ end
63
+
64
+ def delete_example(dataset_id, example_id)
65
+ delete "/language/datasets/#{dataset_id}/examples/#{example_id}"
66
+ end
67
+
68
+ def train_dataset(dataset_id:, name:)
69
+ post '/language/train', datasetId: dataset_id, name: name
70
+ end
71
+
72
+ def retain_dataset(params)
73
+ post '/language/retrain', params
74
+ end
75
+
76
+ def training_status(model_id)
77
+ get "/language/train/#{model_id}"
78
+ end
79
+
80
+ def model_metrics(model_id)
81
+ get "/language/models/#{model_id}"
82
+ end
83
+
84
+ def all_models(dataset_id)
85
+ get "/language/datasets/#{dataset_id}/models"
86
+ end
87
+ end
88
+ end
89
+
90
+ LanguageClient = V2::LanguageClient
91
+ end
92
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Salesforce
4
+ module Einstein
5
+ VERSION = '0.0.1'
6
+ end
7
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'salesforce/einstein/base'
4
+
5
+ module Salesforce
6
+ module Einstein
7
+ module V2
8
+ class VisionClient < Salesforce::Einstein::Base
9
+ def predict_with_url(url, modelId = 'GeneralImageClassifier')
10
+ post '/vision/predict', sampleLocation: url, modelId: modelId
11
+ end
12
+
13
+ # def predict_with_file path, modelId = 'GeneralImageClassifier'
14
+ # post '/predict', {sampleContent: path, modelId: modelId}
15
+ # end
16
+
17
+ def predict_with_base64(base64_string, modelId = 'GeneralImageClassifier')
18
+ post '/vision/predict', sampleBase64Content: base64_string, modelId: modelId
19
+ end
20
+
21
+ def create_dataset(name, labels, type = 'image')
22
+ post '/vision/datasets', type: type, name: name, labels: labels
23
+ end
24
+
25
+ def all_datasets
26
+ get '/vision/datasets'
27
+ end
28
+
29
+ def dataset(dataset_id)
30
+ get "/vision/datasets/#{dataset_id}"
31
+ end
32
+
33
+ def delete_dataset(dataset_id)
34
+ delete "/vision/datasets/#{dataset_id}"
35
+ end
36
+
37
+ def deletion_status(deletion_id)
38
+ get "/vision/deletion/#{deletion_id}"
39
+ end
40
+
41
+ def create_label(dataset_id, name)
42
+ post "/vision/datasets/#{dataset_id}/labels", name: name
43
+ end
44
+
45
+ def label(dataset_id, label_id)
46
+ get "/vision/datasets/#{dataset_id}/labels/#{label_id}"
47
+ end
48
+
49
+ def create_example(dataset_id, params)
50
+ post "/vision/datasets/#{dataset_id}/examples", params
51
+ end
52
+
53
+ def all_examples(dataset_id)
54
+ get "/vision/datasets/#{dataset_id}/examples"
55
+ end
56
+
57
+ def all_examples_for_label(dataset_id, label_id)
58
+ get "/vision/datasets/#{dataset_id}/examples?labelId=#{label_id}"
59
+ end
60
+
61
+ def delete_example(dataset_id, example_id)
62
+ delete "/vision/datasets/#{dataset_id}/examples/#{example_id}"
63
+ end
64
+
65
+ def train_dataset(params)
66
+ post '/vision/train', params
67
+ end
68
+
69
+ def retain_dataset(params)
70
+ post '/vision/retrain', params
71
+ end
72
+
73
+ def training_status(model_id)
74
+ get "/vision/train/#{model_id}"
75
+ end
76
+
77
+ def model_metrics(model_id)
78
+ get "/vision/models/#{model_id}"
79
+ end
80
+
81
+ def all_models(dataset_id)
82
+ get "/datasets/#{dataset_id}/models"
83
+ end
84
+ end
85
+ end
86
+
87
+ VisionClient = V2::VisionClient
88
+ end
89
+ end
@@ -0,0 +1,34 @@
1
+
2
+ # frozen_string_literal: true
3
+
4
+ lib = File.expand_path('lib', __dir__)
5
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
+ require 'salesforce/einstein/version'
7
+
8
+ Gem::Specification.new do |spec|
9
+ spec.name = 'salesforce-einstein'
10
+ spec.version = ::Salesforce::Einstein::VERSION
11
+ spec.authors = ['tzmfreedom']
12
+ spec.email = ['makoto_tajitsu@hotmail.co.jp']
13
+
14
+ spec.summary = 'API client for Salesforce Einstein.'
15
+ spec.description = 'API client for Salesforce Einstein(https://einstein.ai/).'
16
+ spec.homepage = 'https://github.com/tzmfreedom/salesforce-einstein'
17
+ spec.license = 'MIT'
18
+
19
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
20
+ f.match(%r{^(test|spec|features)/})
21
+ end
22
+ spec.bindir = 'exe'
23
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
+ spec.require_paths = ['lib']
25
+
26
+ spec.add_runtime_dependency 'faraday'
27
+ spec.add_runtime_dependency 'jwt', '~> 1.5'
28
+
29
+ spec.add_development_dependency 'bundler', '~> 1.13'
30
+ spec.add_development_dependency 'rake', '~> 10.0'
31
+ spec.add_development_dependency 'rspec', '~> 3.0'
32
+ spec.add_development_dependency 'timecop', '~> 0.8'
33
+ spec.add_development_dependency 'webmock', '~> 2.1'
34
+ end
metadata ADDED
@@ -0,0 +1,157 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: salesforce-einstein
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - tzmfreedom
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-04-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: jwt
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.5'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.13'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.13'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: timecop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.8'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.8'
97
+ - !ruby/object:Gem::Dependency
98
+ name: webmock
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.1'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2.1'
111
+ description: API client for Salesforce Einstein(https://einstein.ai/).
112
+ email:
113
+ - makoto_tajitsu@hotmail.co.jp
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".gitignore"
119
+ - ".rspec"
120
+ - ".travis.yml"
121
+ - Gemfile
122
+ - LICENSE.txt
123
+ - README.md
124
+ - Rakefile
125
+ - bin/console
126
+ - bin/setup
127
+ - lib/salesforce-einstein.rb
128
+ - lib/salesforce/einstein/base.rb
129
+ - lib/salesforce/einstein/language_client.rb
130
+ - lib/salesforce/einstein/version.rb
131
+ - lib/salesforce/einstein/vision_client.rb
132
+ - salesforce-einstein.gemspec
133
+ homepage: https://github.com/tzmfreedom/salesforce-einstein
134
+ licenses:
135
+ - MIT
136
+ metadata: {}
137
+ post_install_message:
138
+ rdoc_options: []
139
+ require_paths:
140
+ - lib
141
+ required_ruby_version: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ required_rubygems_version: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ requirements: []
152
+ rubyforge_project:
153
+ rubygems_version: 2.7.6
154
+ signing_key:
155
+ specification_version: 4
156
+ summary: API client for Salesforce Einstein.
157
+ test_files: []