search_spring 0.2.0

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,70 @@
1
+ require_relative 'errors'
2
+ module SearchSpring
3
+ API_ENDPOINT = 'https://api.searchspring.net'.freeze
4
+
5
+ #
6
+ #
7
+ class Client
8
+ attr_reader :site_id, :conn, :secret_key
9
+
10
+ def initialize(site_id, secret_key, req_options = {})
11
+ @site_id = site_id
12
+ @secret_key = secret_key
13
+ raise Errors::AuthenticationError, 'No Site ID provided.' unless @site_id
14
+ unless @secret_key
15
+ raise Errors::AuthenticationError, 'No Secret Key provided.'
16
+ end
17
+
18
+ @conn = connection(req_options)
19
+ end
20
+
21
+ def upsert(feed_id:, products: [])
22
+ conn.post(
23
+ 'api/index/upsert.json',
24
+ feedId: feed_id,
25
+ records: products
26
+ )
27
+ end
28
+
29
+ def update(feed_id:, products: [])
30
+ conn.post(
31
+ 'api/index/update.json',
32
+ feedId: feed_id,
33
+ records: products
34
+ )
35
+ end
36
+
37
+ def delete(feed_id:, product_ids: [])
38
+ conn.post(
39
+ 'api/index/delete.json',
40
+ feedId: feed_id,
41
+ records: product_ids
42
+ )
43
+ end
44
+
45
+ private
46
+
47
+ def connection(options = {})
48
+ Faraday.new(default_req_options.merge(options)) do |f|
49
+ f.headers['Accept'] = 'application/json'
50
+ f.request :json
51
+ f.request :basic_auth, site_id, secret_key
52
+ f.response :logger
53
+ f.adapter :excon
54
+ f.use Errors::RequestError
55
+ end
56
+ end
57
+
58
+ def default_req_options
59
+ {
60
+ url: API_ENDPOINT,
61
+ ssl: {
62
+ ca_path: SearchSpring::DEFAULT_CA_BUNDLE_PATH,
63
+ ca_file: File.join(
64
+ SearchSpring::DEFAULT_CA_BUNDLE_PATH, 'ca-certificates.crt'
65
+ )
66
+ }
67
+ }
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,30 @@
1
+ module SearchSpring
2
+ module Errors
3
+ class SearchSpringError < ::StandardError; end
4
+ class NotFound < SearchSpringError; end
5
+ class UnprocessableEntity < SearchSpringError; end
6
+ class InternalServerError < SearchSpringError; end
7
+ class NotAuthorized < SearchSpringError; end
8
+ class AuthenticationError < SearchSpringError; end
9
+
10
+ class RequestError < Faraday::Response::Middleware
11
+ def on_complete(env)
12
+ # Ignore any non-error response codes
13
+ return if (status = env[:status]) < 400
14
+ case status
15
+ when 404
16
+ raise Errors::NotFound, env[:body]
17
+ when 422
18
+ raise Errors::UnprocessableEntity, env[:body]
19
+ when 401
20
+ raise Errors::NotAuthorized, env[:body]
21
+ when 407
22
+ # mimic the behavior that we get with proxy requests with HTTPS
23
+ raise Faraday::Error::ConnectionFailed, %{407 "Proxy Authentication Required "}
24
+ else
25
+ raise Errors::InternalServerError, env[:body] # Treat any other errors as 500
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,3 @@
1
+ module SearchSpring
2
+ VERSION = "0.2.0"
3
+ end
@@ -0,0 +1,9 @@
1
+ require 'excon'
2
+ require 'faraday'
3
+ require 'faraday_middleware'
4
+
5
+ require_relative 'search_spring/version'
6
+ require_relative 'search_spring/client'
7
+ module SearchSpring
8
+ DEFAULT_CA_BUNDLE_PATH = File.dirname(__FILE__) + '/data'
9
+ end
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'search_spring/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'search_spring'
8
+ spec.version = SearchSpring::VERSION
9
+ spec.authors = ['Maxim Pechnikov']
10
+ spec.email = ['parallel588@gmail.com']
11
+ spec.summary = 'You heard us, a Ruby wrapper for the SearchSpring Live Indexing API'
12
+ spec.description = 'Ruby wrapper for the SearchSpring Live Indexing API'
13
+ spec.homepage = 'https://searchspring.com/'
14
+
15
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
16
+ f.match(%r{^(test|spec|features)/})
17
+ end
18
+ spec.bindir = 'exe'
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ['lib']
21
+
22
+ spec.add_runtime_dependency 'excon', '~> 0.54', '>= 0.54.0'
23
+ spec.add_runtime_dependency 'faraday', ['>= 0.9.2', '< 1.0']
24
+ spec.add_runtime_dependency 'faraday_middleware', ['>= 0.9.2', '< 1.0']
25
+ spec.add_runtime_dependency 'multi_json', '~> 1.12', '>= 1.12.1'
26
+
27
+ spec.add_development_dependency 'bundler', '~> 1.14'
28
+ spec.add_development_dependency 'rake', '~> 10.0'
29
+ spec.add_development_dependency 'rspec', '~> 3.5'
30
+ spec.add_development_dependency 'pry', '~> 0.10.3'
31
+ spec.add_development_dependency 'webmock', '~> 2.3', '>= 2.3.2'
32
+ end
metadata ADDED
@@ -0,0 +1,213 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: search_spring
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Maxim Pechnikov
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-02-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: excon
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.54'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.54.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '0.54'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 0.54.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: faraday
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 0.9.2
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '1.0'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 0.9.2
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '1.0'
53
+ - !ruby/object:Gem::Dependency
54
+ name: faraday_middleware
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: 0.9.2
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: '1.0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 0.9.2
70
+ - - "<"
71
+ - !ruby/object:Gem::Version
72
+ version: '1.0'
73
+ - !ruby/object:Gem::Dependency
74
+ name: multi_json
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '1.12'
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 1.12.1
83
+ type: :runtime
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.12'
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: 1.12.1
93
+ - !ruby/object:Gem::Dependency
94
+ name: bundler
95
+ requirement: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '1.14'
100
+ type: :development
101
+ prerelease: false
102
+ version_requirements: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - "~>"
105
+ - !ruby/object:Gem::Version
106
+ version: '1.14'
107
+ - !ruby/object:Gem::Dependency
108
+ name: rake
109
+ requirement: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - "~>"
112
+ - !ruby/object:Gem::Version
113
+ version: '10.0'
114
+ type: :development
115
+ prerelease: false
116
+ version_requirements: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - "~>"
119
+ - !ruby/object:Gem::Version
120
+ version: '10.0'
121
+ - !ruby/object:Gem::Dependency
122
+ name: rspec
123
+ requirement: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - "~>"
126
+ - !ruby/object:Gem::Version
127
+ version: '3.5'
128
+ type: :development
129
+ prerelease: false
130
+ version_requirements: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - "~>"
133
+ - !ruby/object:Gem::Version
134
+ version: '3.5'
135
+ - !ruby/object:Gem::Dependency
136
+ name: pry
137
+ requirement: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - "~>"
140
+ - !ruby/object:Gem::Version
141
+ version: 0.10.3
142
+ type: :development
143
+ prerelease: false
144
+ version_requirements: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - "~>"
147
+ - !ruby/object:Gem::Version
148
+ version: 0.10.3
149
+ - !ruby/object:Gem::Dependency
150
+ name: webmock
151
+ requirement: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - "~>"
154
+ - !ruby/object:Gem::Version
155
+ version: '2.3'
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: 2.3.2
159
+ type: :development
160
+ prerelease: false
161
+ version_requirements: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '2.3'
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: 2.3.2
169
+ description: Ruby wrapper for the SearchSpring Live Indexing API
170
+ email:
171
+ - parallel588@gmail.com
172
+ executables: []
173
+ extensions: []
174
+ extra_rdoc_files: []
175
+ files:
176
+ - ".gitignore"
177
+ - ".rspec"
178
+ - ".travis.yml"
179
+ - Gemfile
180
+ - README.md
181
+ - Rakefile
182
+ - bin/console
183
+ - bin/setup
184
+ - lib/data/ca-certificates.crt
185
+ - lib/search_spring.rb
186
+ - lib/search_spring/client.rb
187
+ - lib/search_spring/errors.rb
188
+ - lib/search_spring/version.rb
189
+ - search_spring.gemspec
190
+ homepage: https://searchspring.com/
191
+ licenses: []
192
+ metadata: {}
193
+ post_install_message:
194
+ rdoc_options: []
195
+ require_paths:
196
+ - lib
197
+ required_ruby_version: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ required_rubygems_version: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - ">="
205
+ - !ruby/object:Gem::Version
206
+ version: '0'
207
+ requirements: []
208
+ rubyforge_project:
209
+ rubygems_version: 2.5.2
210
+ signing_key:
211
+ specification_version: 4
212
+ summary: You heard us, a Ruby wrapper for the SearchSpring Live Indexing API
213
+ test_files: []