simply_suggest 0.1.1 → 0.1.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.
- checksums.yaml +4 -4
- data/.travis.yml +15 -0
- data/README.md +81 -17
- data/lib/simply_suggest/api_request.rb +15 -3
- data/lib/simply_suggest/configuration.rb +12 -0
- data/lib/simply_suggest/controller_helper.rb +56 -12
- data/lib/simply_suggest/error.rb +1 -1
- data/lib/simply_suggest/request.rb +28 -2
- data/lib/simply_suggest/version.rb +1 -1
- data/lib/simply_suggest/view_helper.rb +6 -2
- data/simply_suggest.gemspec +2 -2
- data/spec/request_spec.rb +39 -21
- metadata +4 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7c78798b5aff267bae7ade50c16084b536ce015f
|
4
|
+
data.tar.gz: a154d4338345e32eb951adc15dbec05392051831
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 315207c8ba09413717422f01e61d39e6b414dc0a9ddcb03a33e425b7fc383c5dbcfc8a888c9c3ebc6f95fe09f1fa641ab1a5da5f527006b2a0ef001ba9a1e1be
|
7
|
+
data.tar.gz: e6c30a30ad6227fb0f35cb09ff8e79d879e290b82c5e9b5fec8a0f2a19a5a7db8cdc1d8c2ba75cc246c962e4ada85beac1fad7060c0caf5c0bdc6c499a203b63
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,6 +1,13 @@
|
|
1
|
-
#
|
1
|
+
# SimplySuggest
|
2
2
|
|
3
|
-
|
3
|
+
[](https://travis-ci.org/SimplySuggest/simply_suggest_ruby)
|
4
|
+
[](https://hakiri.io/github/SimplySuggest/simply_suggest_ruby/master)
|
5
|
+
[](https://codeclimate.com/github/SimplySuggest/simply_suggest_ruby)
|
6
|
+
|
7
|
+
SimplySuggest implementation for Ruby.
|
8
|
+
You need an account at www.simply-suggest.com to use this gem.
|
9
|
+
|
10
|
+
Direct API-access to all the methods which are available and several helpers to get things a bit less complex.
|
4
11
|
|
5
12
|
## Installation
|
6
13
|
|
@@ -16,32 +23,89 @@ Or install it yourself as:
|
|
16
23
|
|
17
24
|
$ gem install simply_suggest
|
18
25
|
|
19
|
-
##
|
26
|
+
## Configuration
|
20
27
|
|
21
|
-
|
28
|
+
For rails put initialization into config/initializers/simply_suggest.rb
|
29
|
+
|
30
|
+
SimplySuggest.configure do |c|
|
31
|
+
c.secret_key = "YOUR SECRET KEY"
|
32
|
+
c.public_key = "YOUR PUBLIC KEY"
|
33
|
+
end
|
22
34
|
|
23
35
|
## Usage
|
24
36
|
|
25
37
|
After installing the GEM you can use within your controllers or helpers the following methods
|
26
38
|
|
27
|
-
|
28
|
-
recommendations_for
|
39
|
+
This will return an array of object ids which are related to this object
|
40
|
+
recommendations_for @product
|
41
|
+
# => [1,2,3,4,5]
|
42
|
+
|
43
|
+
This will autoload all objects from your database
|
44
|
+
|
45
|
+
recommendations_for @product, load: true
|
46
|
+
# => [Product, Product, Product]
|
47
|
+
|
48
|
+
This will return an hash of data which are recommended for the user
|
49
|
+
|
50
|
+
user_recommendations current_user.id
|
51
|
+
# => [{ type: "article", id: 1 }, { type: "product", id: 1 }]
|
52
|
+
|
53
|
+
This will autoload the data from your database
|
54
|
+
|
55
|
+
user_recommendations current_user.id, load: true
|
56
|
+
# => [Product, Article, Product]
|
57
|
+
|
58
|
+
This will load the current trending objects
|
59
|
+
|
60
|
+
get_trending_objects "article", load: true
|
61
|
+
# => [Article, Article, Article]
|
62
|
+
|
63
|
+
You can use the search api accessing the following method in your controller
|
29
64
|
|
30
|
-
|
31
|
-
|
65
|
+
search_objects "lorem ipsum", "article", load: true
|
66
|
+
# => { results: [Article, Article, Article], facets: nil, conditions: nil }
|
67
|
+
|
68
|
+
You can specify facet fields
|
69
|
+
|
70
|
+
search_objects "lorem ipsum", "article", load: true, facets: [:category_id]
|
71
|
+
# => { results: [Article, Article, Article], facets: { category_id: { key: 4, doc_count: 2 } }, conditions: nil }
|
72
|
+
|
73
|
+
you can set autoload within the config to let load default to true
|
74
|
+
|
75
|
+
SimplySuggest.configure do |c|
|
76
|
+
c.autoload = false
|
77
|
+
end
|
78
|
+
|
79
|
+
All helpers will raise a ``SimplySuggest::Error`` if something went wrong so you easily catch them.
|
32
80
|
|
33
81
|
### JavaScript-Implementation
|
34
82
|
|
35
|
-
|
83
|
+
to use the javascript tracking methods you need to add this line to your <head> or footer
|
84
|
+
|
36
85
|
<%= simply_suggest_script %>
|
37
86
|
|
38
|
-
|
39
|
-
|
87
|
+
then somewhere on your side you can call this function to get the javascript calls
|
88
|
+
|
89
|
+
<%= get_tracking_code user_id: unique_user_id, object_id: unique_object_id, object_type: object_type, event: "view" %>
|
90
|
+
|
91
|
+
available event types are
|
92
|
+
|
93
|
+
:buy
|
94
|
+
:like
|
95
|
+
:dislike
|
96
|
+
:favorite
|
97
|
+
:view
|
98
|
+
:add-to-basket
|
99
|
+
|
100
|
+
You should use the primary key of your user or generate and send a unique user id which is saved to the session or cookie so you send always the same one
|
101
|
+
|
102
|
+
## Changes
|
103
|
+
|
104
|
+
See the [CHANGELOG.md](CHANGELOG.md) file for details.
|
40
105
|
|
41
|
-
## Contributing
|
106
|
+
## Contributing to SimplySuggest
|
42
107
|
|
43
|
-
1.
|
44
|
-
2.
|
45
|
-
3.
|
46
|
-
4.
|
47
|
-
5. Create a new Pull Request
|
108
|
+
1. Check out the Master
|
109
|
+
2. Fork the project.
|
110
|
+
3. Start a feature/bugfix branch.
|
111
|
+
4. Commit and push until you are happy with your contribution.
|
@@ -1,8 +1,20 @@
|
|
1
1
|
module SimplySuggest
|
2
2
|
class ApiRequest
|
3
3
|
def get url, params = {}, headers = {}
|
4
|
+
execute_request :get, url, params, headers
|
5
|
+
end
|
6
|
+
|
7
|
+
def post url, params = {}, headers = {}
|
8
|
+
execute_request :post, url, params, headers
|
9
|
+
end
|
10
|
+
|
11
|
+
def patch url, params = {}, headers = {}
|
12
|
+
execute_request :patch, url, params, headers
|
13
|
+
end
|
14
|
+
|
15
|
+
def execute_request method, url, params = {}, headers = {}
|
4
16
|
begin
|
5
|
-
response = rest_client.
|
17
|
+
response = rest_client.send(method) do |request|
|
6
18
|
configure_request(url, request: request, params: params, headers: headers)
|
7
19
|
end
|
8
20
|
parse_response(response.body)
|
@@ -63,8 +75,8 @@ module SimplySuggest
|
|
63
75
|
|
64
76
|
if parsed_response
|
65
77
|
error_to_raise.body = parsed_response
|
66
|
-
error_to_raise.
|
67
|
-
error_to_raise.
|
78
|
+
error_to_raise.error_code = parsed_response["error_code"] if parsed_response["error_code"]
|
79
|
+
error_to_raise.message = parsed_response["message"] if parsed_response["message"]
|
68
80
|
end
|
69
81
|
|
70
82
|
error_to_raise.status_code = error.response[:status]
|
@@ -25,12 +25,24 @@ module SimplySuggest
|
|
25
25
|
# default: simply-suggest.com
|
26
26
|
attr_accessor :api_domain
|
27
27
|
|
28
|
+
# Api Domain
|
29
|
+
#
|
30
|
+
# default: simply-suggest.com
|
31
|
+
attr_accessor :domain
|
32
|
+
|
33
|
+
# Autoload objects
|
34
|
+
#
|
35
|
+
# default: false
|
36
|
+
attr_accessor :autoload
|
37
|
+
|
28
38
|
def initialize
|
29
39
|
@secret_key = nil
|
30
40
|
@public_key = nil
|
31
41
|
@timeout = 2
|
32
42
|
@api_version = "v1"
|
43
|
+
@domain = "simply-suggest.com"
|
33
44
|
@api_domain = "http://v1.simply-suggest.com"
|
45
|
+
@autoload = false
|
34
46
|
end
|
35
47
|
end
|
36
48
|
|
@@ -8,14 +8,16 @@ module SimplySuggest
|
|
8
8
|
# options : hash [optional]
|
9
9
|
#
|
10
10
|
def recommendations_for item, options = {}
|
11
|
-
|
12
|
-
|
11
|
+
options = options.reverse_merge(default_options)
|
12
|
+
|
13
13
|
klass = item.is_a?(Hash) ? item.delete(:class) : item.class.to_s.downcase
|
14
14
|
object_id = item.is_a?(Hash) ? item.delete(:object_id) : item.id
|
15
15
|
|
16
|
-
data = request_object.object_types.send(klass).object.recommendations.page(page).limit(limit).get(object_id)
|
17
|
-
return [] if data["
|
18
|
-
data["
|
16
|
+
data = request_object.object_types.send(klass).object.recommendations.page(options[:page]).limit(options[:limit]).get(object_id)
|
17
|
+
return [] if data["recommendations"].blank?
|
18
|
+
ids = data["recommendations"].map { |d| d["recommendation_id"] }
|
19
|
+
return item.class.where(id: ids) if options[:load]
|
20
|
+
ids
|
19
21
|
end
|
20
22
|
|
21
23
|
# returns recommendations for the user_id
|
@@ -24,22 +26,64 @@ module SimplySuggest
|
|
24
26
|
# options : hash [optional]
|
25
27
|
#
|
26
28
|
def user_recommendations user_id, options = {}
|
27
|
-
|
28
|
-
limit = options.delete(:limit) || 10
|
29
|
-
page = options.delete(:page) || 1
|
29
|
+
options = options.reverse_merge(default_options)
|
30
30
|
|
31
|
-
if object_type.present?
|
32
|
-
data = request_object.user.send(object_type).recommendations.page(page).limit(limit).get(user_id)
|
31
|
+
if options[:object_type].present?
|
32
|
+
data = request_object.user.send(options[:object_type]).recommendations.page(options[:page]).limit(options[:limit]).get(user_id)
|
33
33
|
else
|
34
34
|
data = request_object.user.recommendations.page(page).limit(limit).get(user_id)
|
35
35
|
end
|
36
|
-
return [] if data["
|
37
|
-
data["
|
36
|
+
return [] if data["recommendations"].blank?
|
37
|
+
return data["recommendations"].map { |d| d["object_type"].classify.constantize.where(id: d["recommendation_id"]).first }.reject(&:nil?) if options[:load]
|
38
|
+
data["recommendations"].map { |d| { type: d["object_type"], id: d["recommendation_id"] } }
|
39
|
+
end
|
40
|
+
|
41
|
+
# returns trending data for the object type
|
42
|
+
#
|
43
|
+
# klass : string
|
44
|
+
# options : hash [optional]
|
45
|
+
#
|
46
|
+
def get_trending_objects klass, options = {}
|
47
|
+
options = options.reverse_merge(default_options)
|
48
|
+
|
49
|
+
data = request_object.object_type.trending.send(klass).page(page).limit(limit).get
|
50
|
+
return [] if data["trending"].blank?
|
51
|
+
return klass.classify.constantize.where(id: data["trending"].map { |d| d["external_id"] }) if options[:load]
|
52
|
+
data["trending"].map { |d| { type: d["object_type"], id: d["external_id"] } }
|
53
|
+
end
|
54
|
+
|
55
|
+
def search_objects query, klass, options = {}
|
56
|
+
options = options.reverse_merge(default_options)
|
57
|
+
|
58
|
+
request = request_object.object_type.search.send(klass).page(options[:page]).limit(options[:limit]).add_params(query: query)
|
59
|
+
request.add_param(:conditions, options[:conditions]) if options[:conditions].present?
|
60
|
+
request.add_param(:facets, options[:facets]) if options[:facets].present?
|
61
|
+
|
62
|
+
data = request.get
|
63
|
+
return [] if data["objects"].blank?
|
64
|
+
if options[:load]
|
65
|
+
values = {}
|
66
|
+
values[:results] = data["objects"].map { |d| d["object_type"].classify.constantize.where(id: d["external_id"]).first }.reject(&:nil?)
|
67
|
+
values[:facets] = data["facets"]
|
68
|
+
values[:conditions] = data["conditions"]
|
69
|
+
|
70
|
+
return values
|
71
|
+
end
|
72
|
+
|
73
|
+
data
|
38
74
|
end
|
39
75
|
|
40
76
|
protected
|
41
77
|
def request_object
|
42
78
|
@request_object ||= SimplySuggest::Request.new
|
43
79
|
end
|
80
|
+
|
81
|
+
def default_options
|
82
|
+
{
|
83
|
+
limit: 10,
|
84
|
+
page: 1,
|
85
|
+
load: SimplySuggest.config.autoload
|
86
|
+
}
|
87
|
+
end
|
44
88
|
end
|
45
89
|
end
|
data/lib/simply_suggest/error.rb
CHANGED
@@ -25,13 +25,39 @@ module SimplySuggest
|
|
25
25
|
values
|
26
26
|
end
|
27
27
|
|
28
|
+
def post *args
|
29
|
+
@path_parts += args.to_a
|
30
|
+
values = api_request.post(path, @params)
|
31
|
+
reset
|
32
|
+
values
|
33
|
+
end
|
34
|
+
|
35
|
+
def patch *args
|
36
|
+
@path_parts += args.to_a
|
37
|
+
values = api_request.patch(path, @params)
|
38
|
+
reset
|
39
|
+
values
|
40
|
+
end
|
41
|
+
|
28
42
|
def limit num
|
29
|
-
|
43
|
+
add_param :limit, num
|
30
44
|
self
|
31
45
|
end
|
32
46
|
|
33
47
|
def page num
|
34
|
-
|
48
|
+
add_param :page, num
|
49
|
+
self
|
50
|
+
end
|
51
|
+
|
52
|
+
def add_param name, value
|
53
|
+
@params[name.to_sym] = value
|
54
|
+
self
|
55
|
+
end
|
56
|
+
|
57
|
+
def add_params params = {}
|
58
|
+
params.each_pair do |name, value|
|
59
|
+
@params[name.to_sym] = value
|
60
|
+
end
|
35
61
|
self
|
36
62
|
end
|
37
63
|
|
@@ -11,7 +11,7 @@ module SimplySuggest
|
|
11
11
|
content_tag :script do
|
12
12
|
"(function() {
|
13
13
|
var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
|
14
|
-
po.src = '//static.#{SimplySuggest.config.domain}/script/
|
14
|
+
po.src = '//static.#{SimplySuggest.config.domain}/script/v1.js';
|
15
15
|
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
|
16
16
|
})();".html_safe
|
17
17
|
end
|
@@ -34,8 +34,12 @@ module SimplySuggest
|
|
34
34
|
content_tag :script, script
|
35
35
|
end
|
36
36
|
|
37
|
+
def track_click source_id, destination, user_id, options = {}
|
38
|
+
track_recommendation_click(source_id, destination.id, destination.class.to_s.downcase, user_id, options)
|
39
|
+
end
|
40
|
+
|
37
41
|
def track_recommendation_click source_id, destination_id, user_id, klass, options = {}
|
38
|
-
use_script
|
42
|
+
use_script = options[:script] == nil ? true : options[:script]
|
39
43
|
|
40
44
|
script = "
|
41
45
|
window.track_recommendation = window.track_recommendation || [];
|
data/simply_suggest.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = SimplySuggest::VERSION
|
9
9
|
spec.authors = ["Simply Suggest"]
|
10
10
|
spec.email = ["info@simply-suggest.com"]
|
11
|
-
spec.summary = %q{Api for www.simply-suggest.com here}
|
11
|
+
spec.summary = %q{Api for http://www.simply-suggest.com here}
|
12
12
|
spec.homepage = "http://www.simply-suggest.com"
|
13
13
|
spec.license = "MIT"
|
14
14
|
|
@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
18
|
spec.require_paths = ["lib"]
|
19
19
|
|
20
|
-
spec.add_dependency 'actionpack', '
|
20
|
+
spec.add_dependency 'actionpack', '>= 3.0.0'
|
21
21
|
spec.add_dependency 'faraday', "~> 0.9"
|
22
22
|
spec.add_dependency 'multi_json', '~> 1.11'
|
23
23
|
|
data/spec/request_spec.rb
CHANGED
@@ -1,30 +1,43 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
class TestController < ActionController::Base
|
4
|
-
def test1
|
5
|
-
@bot_detector = BotDetection::Detector.new(user_agent: BotDetection::BotUserAgents.first, remote_ip: "127.0.0.1")
|
6
|
-
end
|
7
|
-
|
8
|
-
def test2
|
9
|
-
@bot_detector = BotDetection::Detector.new(user_agent: "Googlebot/2.1 (+http://www.googlebot.com/bot.html)", remote_ip: "66.249.66.1")
|
10
|
-
end
|
11
4
|
end
|
12
5
|
|
13
6
|
describe "Api::Calls" do
|
14
7
|
before {
|
15
8
|
SimplySuggest.configure do |c|
|
16
|
-
c.secret_key = "
|
17
|
-
c.public_key = "
|
18
|
-
c.api_domain = "http://v1.recommendation.dev"
|
9
|
+
c.secret_key = "58f38a8b-ca16-4d44-acc9-0a6f0bf0919f"
|
10
|
+
c.public_key = "cbb8f914-d89f-49ef-b732-8b0e133f6cb5"
|
19
11
|
end
|
20
12
|
}
|
21
13
|
|
22
14
|
context 'api calls' do
|
23
|
-
it
|
15
|
+
it "creates an object_types and raises an error" do
|
16
|
+
expect { SimplySuggest::Request.object_type.create.add_params(name: "article").post }.to raise_exception(SimplySuggest::Error)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "updates an object_type" do
|
20
|
+
result = SimplySuggest::Request.object_type.update.send("article").add_params(name: "article").patch
|
21
|
+
expect(result["error"]).to eq(false)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "creates an object in the article object type" do
|
25
|
+
expect { SimplySuggest::Request.object_type.send("article").object.create.add_params(object_id: "1").post }.to raise_exception(SimplySuggest::Error)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "updates an object with some data" do
|
29
|
+
result = SimplySuggest::Request.object_type.send("article").object.update.add_params(data: { title: "lorem", description: "test" }).patch(1)
|
30
|
+
expect(result["error"]).to eq(false)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'checks object type api methods' do
|
24
34
|
expect(SimplySuggest::Request.object_types.get.length).to be > 0
|
25
35
|
expect(SimplySuggest::Request.object_types.limit(1).get.length).to be == 1
|
26
|
-
|
27
|
-
|
36
|
+
end
|
37
|
+
|
38
|
+
it "checks object api methods" do
|
39
|
+
expect(SimplySuggest::Request.object_type.article.get.length).to be > 0
|
40
|
+
expect { SimplySuggest::Request.object_types.article.object.recommendations.get(1026) }.to raise_exception(SimplySuggest::Error)
|
28
41
|
end
|
29
42
|
end
|
30
43
|
|
@@ -33,15 +46,20 @@ describe "Api::Calls" do
|
|
33
46
|
expect(ActionController::Base.included_modules).to include(SimplySuggest::ControllerHelper)
|
34
47
|
end
|
35
48
|
|
36
|
-
it
|
37
|
-
|
38
|
-
expect
|
49
|
+
it "tests search methods" do
|
50
|
+
result = TestController.new.search_objects("test", "article")
|
51
|
+
expect(result["objects"].length).to eq(1)
|
39
52
|
end
|
40
53
|
|
41
|
-
it 'should test controller helpers with
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
54
|
+
# it 'should test controller helpers with object recommendations' do
|
55
|
+
# expect(TestController.new.recommendations_for(class: "article", object_id: 1).length).to be > 0
|
56
|
+
# expect { TestController.new.recommendations_for(class: "article", object_id: 123) }.to raise_exception(SimplySuggest::Error)
|
57
|
+
# end
|
58
|
+
|
59
|
+
# it 'should test controller helpers with user recommendations' do
|
60
|
+
# expect(TestController.new.user_recommendations("ffc0635b-e32b-4a3d-a5b6-2703e08bdc14").length).to be > 0
|
61
|
+
# expect(TestController.new.user_recommendations("ffc0635b-e32b-4a3d-a5b6-2703e08bdc14", object_type: "series").length).to be > 0
|
62
|
+
# expect(TestController.new.user_recommendations("ffc0635b-e32b-4a3d-a5b6-2703e08bdc14", object_type: "album").length).to be == 0
|
63
|
+
# end
|
46
64
|
end
|
47
65
|
end
|
metadata
CHANGED
@@ -1,22 +1,19 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simply_suggest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Simply Suggest
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionpack
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 3.0.0
|
20
17
|
- - ">="
|
21
18
|
- !ruby/object:Gem::Version
|
22
19
|
version: 3.0.0
|
@@ -24,9 +21,6 @@ dependencies:
|
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
|
-
- - "~>"
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 3.0.0
|
30
24
|
- - ">="
|
31
25
|
- !ruby/object:Gem::Version
|
32
26
|
version: 3.0.0
|
@@ -108,6 +102,7 @@ extensions: []
|
|
108
102
|
extra_rdoc_files: []
|
109
103
|
files:
|
110
104
|
- ".gitignore"
|
105
|
+
- ".travis.yml"
|
111
106
|
- CHANGELOG.md
|
112
107
|
- Gemfile
|
113
108
|
- LICENSE.txt
|
@@ -147,5 +142,5 @@ rubyforge_project:
|
|
147
142
|
rubygems_version: 2.4.6
|
148
143
|
signing_key:
|
149
144
|
specification_version: 4
|
150
|
-
summary: Api for www.simply-suggest.com here
|
145
|
+
summary: Api for http://www.simply-suggest.com here
|
151
146
|
test_files: []
|