endpoint_base 0.0.1 → 0.1.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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +1 -2
- data/Rakefile +18 -1
- data/app/views/application/500.json.jbuilder +2 -0
- data/app/views/application/response.json.jbuilder +21 -0
- data/endpoint_base.gemspec +17 -6
- data/lib/endpoint_base.rb +29 -8
- data/lib/endpoint_base/concerns.rb +7 -0
- data/lib/endpoint_base/concerns/all.rb +15 -0
- data/lib/endpoint_base/concerns/exception_handler.rb +26 -0
- data/lib/endpoint_base/concerns/param_processor.rb +54 -0
- data/lib/endpoint_base/concerns/rails_responder.rb +20 -0
- data/lib/endpoint_base/concerns/response_dsl.rb +44 -0
- data/lib/endpoint_base/concerns/sinatra_responder.rb +38 -0
- data/lib/endpoint_base/concerns/token_authorization.rb +28 -0
- data/lib/endpoint_base/rails.rb +1 -0
- data/lib/endpoint_base/rails/engine.rb +5 -0
- data/lib/endpoint_base/sinatra.rb +2 -0
- data/lib/endpoint_base/sinatra/base.rb +11 -0
- data/lib/endpoint_base/sinatra/integrator_utils.rb +17 -0
- data/spec/rails/controllers/failing_controller_spec.rb +29 -0
- data/spec/rails/controllers/happy_controller_spec.rb +35 -0
- data/spec/rails/dummy/.gitignore +16 -0
- data/spec/rails/dummy/Gemfile +46 -0
- data/spec/rails/dummy/README.rdoc +28 -0
- data/spec/rails/dummy/Rakefile +6 -0
- data/spec/rails/dummy/app/assets/images/.keep +0 -0
- data/spec/rails/dummy/app/assets/javascripts/application.js +16 -0
- data/spec/rails/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/rails/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/rails/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/rails/dummy/app/controllers/failing_controller.rb +7 -0
- data/spec/rails/dummy/app/controllers/happy_controller.rb +13 -0
- data/spec/rails/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/rails/dummy/app/mailers/.keep +0 -0
- data/spec/rails/dummy/app/models/.keep +0 -0
- data/spec/rails/dummy/app/models/concerns/.keep +0 -0
- data/spec/rails/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/rails/dummy/bin/bundle +3 -0
- data/spec/rails/dummy/bin/rails +4 -0
- data/spec/rails/dummy/bin/rake +4 -0
- data/spec/rails/dummy/config.ru +4 -0
- data/spec/rails/dummy/config/application.rb +28 -0
- data/spec/rails/dummy/config/boot.rb +4 -0
- data/spec/rails/dummy/config/database.yml +25 -0
- data/spec/rails/dummy/config/environment.rb +5 -0
- data/spec/rails/dummy/config/environments/development.rb +29 -0
- data/spec/rails/dummy/config/environments/production.rb +80 -0
- data/spec/rails/dummy/config/environments/test.rb +36 -0
- data/spec/rails/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/rails/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/rails/dummy/config/initializers/inflections.rb +16 -0
- data/spec/rails/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/rails/dummy/config/initializers/secret_token.rb +12 -0
- data/spec/rails/dummy/config/initializers/session_store.rb +3 -0
- data/spec/rails/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/rails/dummy/config/locales/en.yml +23 -0
- data/spec/rails/dummy/config/routes.rb +4 -0
- data/spec/rails/dummy/db/seeds.rb +7 -0
- data/spec/rails/dummy/lib/assets/.keep +0 -0
- data/spec/rails/dummy/lib/tasks/.keep +0 -0
- data/spec/rails/dummy/log/.keep +0 -0
- data/spec/rails/dummy/public/404.html +58 -0
- data/spec/rails/dummy/public/422.html +58 -0
- data/spec/rails/dummy/public/500.html +57 -0
- data/spec/rails/dummy/public/favicon.ico +0 -0
- data/spec/rails/dummy/public/robots.txt +5 -0
- data/spec/rails/dummy/vendor/assets/javascripts/.keep +0 -0
- data/spec/rails/dummy/vendor/assets/stylesheets/.keep +0 -0
- data/spec/rails/spec_helper.rb +13 -0
- data/spec/rails/support/controllers.rb +17 -0
- data/spec/sinatra/endpoint_base_spec.rb +55 -0
- data/spec/sinatra/spec_helper.rb +55 -0
- data/spec/spec_helper.rb +3 -32
- metadata +217 -18
- data/lib/cross_origin.rb +0 -49
- data/lib/integrator_utils.rb +0 -58
- data/spec/cross_origin_spec.rb +0 -20
- data/spec/integrator_utils_spec.rb +0 -52
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e259d563e2e585eb98590a759d3f62387f4a62bf
|
4
|
+
data.tar.gz: 914e441eca4d033b41d2ec674491d1a42294c803
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b9d234ca3a75ee86537058557ec0ca8ddc550d1ab32b010d45f36373343419b234359f66a94e2ea1a001fbef2456b7a35435e8ed0c146bde293b6a06260a2e20
|
7
|
+
data.tar.gz: afd3cc84234a6d8212fa594e5b0e56f946d45333b6ece0c3a6634239b8420f3ce01a5910ee8ddccbcc7b64637e06ad5aee8a3fb1b8f7818b265bc992f2f4a972
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/Rakefile
CHANGED
@@ -1 +1,18 @@
|
|
1
|
-
require
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
|
3
|
+
# Need to run the Rails and Sinatra specs separately so
|
4
|
+
# their dependencies won't pollute each other.
|
5
|
+
|
6
|
+
task :spec do
|
7
|
+
exitcode = 0
|
8
|
+
puts 'Running Rails specs ---------------------'
|
9
|
+
system 'FROM_RAKE=1 bundle exec rspec spec/rails'
|
10
|
+
exitcode = 1 unless $?.exitstatus == 0
|
11
|
+
|
12
|
+
puts 'Running Sinatra specs -------------------'
|
13
|
+
system 'FROM_RAKE=1 bundle exec rspec spec/sinatra'
|
14
|
+
exitcode = 1 unless $?.exitstatus == 0
|
15
|
+
|
16
|
+
exit exitcode
|
17
|
+
end
|
18
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
json.message_id @message['message_id']
|
2
|
+
|
3
|
+
@attrs.each do |name, value|
|
4
|
+
json.set! name, value
|
5
|
+
end if @attrs.present?
|
6
|
+
|
7
|
+
json.parameters @parameters do |parameter|
|
8
|
+
json.name parameter[:name]
|
9
|
+
json.value parameter[:value]
|
10
|
+
end if @parameters.present?
|
11
|
+
|
12
|
+
json.messages @messages do |message|
|
13
|
+
json.message message[:message]
|
14
|
+
json.payload message[:payload]
|
15
|
+
end if @messages.present?
|
16
|
+
|
17
|
+
json.notifications @notifications do |notification|
|
18
|
+
json.level notification[:level]
|
19
|
+
json.subject notification[:subject]
|
20
|
+
json.description notification[:description]
|
21
|
+
end if @notifications.present?
|
data/endpoint_base.gemspec
CHANGED
@@ -4,11 +4,11 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |gem|
|
6
6
|
gem.name = "endpoint_base"
|
7
|
-
gem.version = '0.0
|
7
|
+
gem.version = '0.1.0'
|
8
8
|
gem.authors = ["Andrew Hooker"]
|
9
9
|
gem.email = ["andrew@spreecommerce.com"]
|
10
|
-
gem.description = %q{Shared functionality for
|
11
|
-
gem.summary = %q{
|
10
|
+
gem.description = %q{Shared functionality for SpreeCommerce hub endpoints}
|
11
|
+
gem.summary = %q{SpreeCommerce hub endpoints base library}
|
12
12
|
gem.homepage = "http://www.spreecommerce.com"
|
13
13
|
|
14
14
|
gem.files = `git ls-files`.split($/)
|
@@ -16,14 +16,25 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
17
17
|
gem.require_paths = ["lib"]
|
18
18
|
|
19
|
-
gem.add_dependency 'sinatra', '1.4.3'
|
20
|
-
gem.add_dependency 'sinatra-contrib'
|
21
19
|
gem.add_dependency 'json'
|
20
|
+
gem.add_dependency 'jbuilder'
|
22
21
|
gem.add_dependency 'activesupport'
|
23
22
|
|
23
|
+
#sinatra
|
24
|
+
gem.add_development_dependency 'sinatra', '1.4.3'
|
25
|
+
gem.add_development_dependency 'sinatra-contrib'
|
26
|
+
gem.add_development_dependency 'tilt-jbuilder'
|
27
|
+
gem.add_development_dependency 'rack-test'
|
28
|
+
|
29
|
+
#rails
|
30
|
+
gem.add_development_dependency 'rails', "~> 4.0.0"
|
31
|
+
gem.add_development_dependency 'rspec-rails'
|
32
|
+
gem.add_development_dependency 'sqlite3'
|
33
|
+
|
34
|
+
#dev
|
24
35
|
gem.add_development_dependency 'rake'
|
25
36
|
gem.add_development_dependency 'rspec'
|
26
|
-
gem.add_development_dependency 'rack-test'
|
27
37
|
gem.add_development_dependency 'vcr'
|
38
|
+
gem.add_development_dependency 'simplecov'
|
28
39
|
end
|
29
40
|
|
data/lib/endpoint_base.rb
CHANGED
@@ -1,13 +1,34 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
module EndpointBase
|
2
|
+
def self.framework
|
3
|
+
if defined?(Rails)
|
4
|
+
:rails
|
5
|
+
elsif defined?(Sinatra)
|
6
|
+
:sinatra
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.rails?
|
11
|
+
self.framework == :rails
|
12
|
+
end
|
4
13
|
|
5
|
-
|
6
|
-
|
7
|
-
|
14
|
+
def self.sinatra?
|
15
|
+
self.framework == :sinatra
|
16
|
+
end
|
8
17
|
|
9
|
-
|
10
|
-
|
18
|
+
def self.path_to_views
|
19
|
+
File.expand_path("../app/views", File.dirname(__FILE__))
|
11
20
|
end
|
12
21
|
end
|
13
22
|
|
23
|
+
require 'active_support'
|
24
|
+
require 'endpoint_base/concerns'
|
25
|
+
|
26
|
+
if EndpointBase.rails?
|
27
|
+
require 'endpoint_base/rails'
|
28
|
+
require 'jbuilder'
|
29
|
+
elsif EndpointBase.sinatra?
|
30
|
+
require 'endpoint_base/sinatra'
|
31
|
+
else
|
32
|
+
puts '[Endpoint Base] Neither Rails or Sinatra are defined, you must manually require the relevant endpoint_base files.'
|
33
|
+
end
|
34
|
+
|
@@ -0,0 +1,7 @@
|
|
1
|
+
require 'endpoint_base/concerns/param_processor'
|
2
|
+
require 'endpoint_base/concerns/response_dsl'
|
3
|
+
require 'endpoint_base/concerns/exception_handler'
|
4
|
+
require 'endpoint_base/concerns/token_authorization'
|
5
|
+
require 'endpoint_base/concerns/sinatra_responder'
|
6
|
+
require 'endpoint_base/concerns/rails_responder'
|
7
|
+
require 'endpoint_base/concerns/all'
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module EndpointBase::Concerns
|
2
|
+
module All
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
include EndpointBase::Concerns::TokenAuthorization
|
6
|
+
include EndpointBase::Concerns::ParamProcessor
|
7
|
+
include EndpointBase::Concerns::ResponseDSL
|
8
|
+
include EndpointBase::Concerns::ExceptionHandler
|
9
|
+
|
10
|
+
if EndpointBase.rails?
|
11
|
+
include EndpointBase::Concerns::RailsResponder
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module EndpointBase::Concerns
|
2
|
+
module ExceptionHandler
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
if EndpointBase.rails?
|
7
|
+
rescue_from Exception, :with => :exception_handler
|
8
|
+
elsif EndpointBase.sinatra?
|
9
|
+
error do
|
10
|
+
puts env['sinatra.error'].message
|
11
|
+
puts env['sinatra.error'].backtrace
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def exception_handler(exception)
|
19
|
+
Rails.logger.error exception.backtrace
|
20
|
+
render status: 500, action: '500.json.jbuilder',
|
21
|
+
locals: { error: exception.message }
|
22
|
+
return false
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module EndpointBase::Concerns
|
4
|
+
module ParamProcessor
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
if EndpointBase.rails?
|
9
|
+
helper Helpers
|
10
|
+
|
11
|
+
before_action do
|
12
|
+
prepare_message params
|
13
|
+
prepare_config params
|
14
|
+
end
|
15
|
+
|
16
|
+
elsif EndpointBase.sinatra?
|
17
|
+
helpers Helpers
|
18
|
+
|
19
|
+
before do
|
20
|
+
if request.post?
|
21
|
+
begin
|
22
|
+
parsed = ::JSON.parse(request.body.read).with_indifferent_access
|
23
|
+
rescue Exception => e
|
24
|
+
halt 406
|
25
|
+
end
|
26
|
+
|
27
|
+
prepare_message parsed
|
28
|
+
prepare_config parsed
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def prepare_message(hsh)
|
37
|
+
@message = hsh.slice('message_id', 'payload')
|
38
|
+
end
|
39
|
+
|
40
|
+
def prepare_config(hsh)
|
41
|
+
@config = hsh[:payload]['parameters'] || []
|
42
|
+
@config = @config.inject({}) do |result, param|
|
43
|
+
result[param[:name]] = param[:value]
|
44
|
+
result
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
module Helpers
|
49
|
+
def store_id
|
50
|
+
@config['store_id']
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module EndpointBase::Concerns
|
2
|
+
module RailsResponder
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
if EndpointBase.rails?
|
7
|
+
include Helpers
|
8
|
+
elsif EndpointBase.sinatra?
|
9
|
+
raise 'This Concern is only intended to be used with Rails.'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module Helpers
|
14
|
+
def process_result(code)
|
15
|
+
render "#{EndpointBase.path_to_views}/application/response.json", status: code
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module EndpointBase::Concerns
|
2
|
+
module ResponseDSL
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
if EndpointBase.rails?
|
7
|
+
include Helpers
|
8
|
+
elsif EndpointBase.sinatra?
|
9
|
+
helpers Helpers
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
module Helpers
|
16
|
+
def add_value(name, value)
|
17
|
+
@attrs ||= {}
|
18
|
+
@attrs[name] = value
|
19
|
+
end
|
20
|
+
|
21
|
+
def add_message(message, payload = {})
|
22
|
+
@messages ||= []
|
23
|
+
|
24
|
+
@messages << { message: message,
|
25
|
+
payload: payload }
|
26
|
+
end
|
27
|
+
|
28
|
+
def add_parameter(name, value)
|
29
|
+
@parameters ||= []
|
30
|
+
|
31
|
+
@parameters << { name: name,
|
32
|
+
value: value }
|
33
|
+
end
|
34
|
+
|
35
|
+
def add_notification(level, subject, description, options = {})
|
36
|
+
@notifications ||= []
|
37
|
+
|
38
|
+
@notifications << { level: level,
|
39
|
+
subject: subject,
|
40
|
+
description: description }.merge(options)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module EndpointBase::Concerns
|
2
|
+
module SinatraResponder
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
if EndpointBase.rails?
|
7
|
+
raise 'This Concern is only intended to be used with Sinatra.'
|
8
|
+
elsif EndpointBase.sinatra?
|
9
|
+
helpers Helpers
|
10
|
+
|
11
|
+
before do
|
12
|
+
if request.get? && request.path_info == '/'
|
13
|
+
redirect '/endpoint.json'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
get '/auth' do
|
18
|
+
status 200
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module Helpers
|
24
|
+
def process_result(code, response = nil)
|
25
|
+
status code
|
26
|
+
content_type 'application/json', :charset => 'utf-8'
|
27
|
+
|
28
|
+
if response
|
29
|
+
warn '[DEPRECATION WARNING] Passing a hash as a second argument to `process_result` is deprecated, use Response DSL instead.'
|
30
|
+
@attrs = response
|
31
|
+
end
|
32
|
+
|
33
|
+
jbuilder :'response.json', views: "#{EndpointBase.path_to_views}/application"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module EndpointBase::Concerns
|
2
|
+
module TokenAuthorization
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
if EndpointBase.rails?
|
7
|
+
before_action :authorize_rails
|
8
|
+
elsif EndpointBase.sinatra?
|
9
|
+
before { authorize_sinatra }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def authorize_rails
|
16
|
+
unless request.headers["HTTP_X_AUGURY_TOKEN"] == ENV['ENDPOINT_KEY']
|
17
|
+
render status: 401, json: {text: 'unauthorized'}
|
18
|
+
return false
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def authorize_sinatra
|
23
|
+
return unless request.post?
|
24
|
+
halt 401 if request.env["HTTP_X_AUGURY_TOKEN"] != ENV['ENDPOINT_KEY']
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'endpoint_base/rails/engine'
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module EndpointBase
|
2
|
+
module Sinatra
|
3
|
+
class Base < ::Sinatra::Base
|
4
|
+
include EndpointBase::Concerns::TokenAuthorization
|
5
|
+
include EndpointBase::Concerns::ParamProcessor
|
6
|
+
include EndpointBase::Concerns::ResponseDSL
|
7
|
+
include EndpointBase::Concerns::SinatraResponder
|
8
|
+
include EndpointBase::Concerns::ExceptionHandler
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|