esplanade 0.1.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b0682d7613229adb081ec4a064b247e46c9be269
4
- data.tar.gz: c073b32fbb358e9628942e2bcf3948948f0ae554
3
+ metadata.gz: 136faea6ccc9fb08600dfb9c8d597172bb72e270
4
+ data.tar.gz: 92d86b6dcf3cc3d8d7ad3622bfb99b0c45aabf07
5
5
  SHA512:
6
- metadata.gz: 876e8d7fbe6c903bcde139ca4c194994d8975e84fbd0ec05d54a9d03fdde1c95d8e2f8ee762f634424e5ac1312cedb45f23c269ac85de717ed2793f65120f942
7
- data.tar.gz: 6f5910dd3c251ef09b428eb3fe433c1c0cf4f92762ab4bc5e78cf5f21c5550141589c2a3beef37eba62830e5f00a469ee10747edc360ce77c3e1a050e9db2121
6
+ metadata.gz: 1dfbc8ba44102440c149a1d84be28151fe3ed5a918b7d43233ee58a6cb9d7c2713219571f9555d6e5b577184673827b1e7b109299ab5104cb4abefbd997cd754
7
+ data.tar.gz: ee811221aa1764c746afead9aa85365b035dcc1eecf5f768a27dd503f9acc9c200bccded11c7d7c168a7e482d5aaedbf15ee74ea16273151622565a51b46ae78
data/.rubocop.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.3
2
+ TargetRubyVersion: 2.2
3
3
 
4
4
  Metrics/LineLength:
5
5
  Max: 120
@@ -9,3 +9,12 @@ Style/Documentation:
9
9
 
10
10
  Style/FrozenStringLiteralComment:
11
11
  Enabled: false
12
+
13
+ Metrics/BlockLength:
14
+ Enabled: false
15
+
16
+ Style/IfUnlessModifier:
17
+ Enabled: false
18
+
19
+ Style/RescueModifier:
20
+ Enabled: false
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.3.1
1
+ 2.2.0
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2
4
+ before_install: gem install bundler -v 1.12
data/README.md CHANGED
@@ -1,21 +1,11 @@
1
1
  # Esplanade
2
2
 
3
- This gem helps you validate the request and response documentation API Blueprint.
3
+ [![Build Status](https://travis-ci.org/funbox/esplanade.svg?branch=master)](https://travis-ci.org/funbox/esplanade)
4
4
 
5
-
6
- If the request to the server will be invalid tomogram, it will return a response with a 400 status and the body of the error.
7
- If the server's response will be invalid tomogram, it will return a response with 500 status and the body of the error.
8
-
9
- An example of an error body
10
-
11
- ```ruby
12
- {
13
- "error": [
14
- "The property '#/' did not contain a required property of 'login' in schema deee53ed-f917-5f2f-bccf-0b8af3b749c7",
15
- "The property '#/' did not contain a required property of 'password' in schema deee53ed-f917-5f2f-bccf-0b8af3b749c7"
16
- ]
17
- }
18
- ```
5
+ This gem will help you validation and sinhronize your API in strict accordance to the documentation in
6
+ [API Blueprint](https://apiblueprint.org/) format.
7
+ To do this it automatically searches received requestes and responses in the documentation and run validates
8
+ json-schemas.
19
9
 
20
10
  ## Installation
21
11
 
@@ -35,48 +25,93 @@ Or install it yourself as:
35
25
 
36
26
  ## Usage
37
27
 
38
- ### Rails
28
+ Example:
39
29
 
40
- config/application.rb
30
+ `middlewares/your_middleware.rb`
41
31
 
42
32
  ```ruby
43
- require 'esplanade'
44
- ```
33
+ class YourMiddleware < Esplanade::Middleware
34
+ def call(env)
35
+ request = Esplanade::Request.new(@documentation, env)
36
+ request.validation.valid!
37
+
38
+ status, headers, body = @app.call(env)
39
+
40
+ response = Esplanade::Response.new(request, status, body)
41
+ response.validation.valid!
45
42
 
46
- ### Rake
43
+ [status, headers, body]
44
+ rescue Esplanade::Error => e
45
+ your_render_error(e)
46
+ end
47
+ end
48
+ ```
47
49
 
48
- config/application.rb
50
+ `config/application.rb`
49
51
 
50
52
  ```ruby
51
53
  require 'esplanade'
52
- config.middleware.use Esplanade::Middleware
54
+ Esplanade.configure do |config|
55
+ config.apib_path = 'doc/backend.apib'
56
+ end
57
+
58
+ require_relative '../middlewares/your_middleware'
59
+ config.middleware.use YourMiddleware
53
60
  ```
54
61
 
55
- ## Config
62
+ ## Esplanade::Error
56
63
 
57
- ### tomogram
64
+ From him the `Esplanade::Request::Error` and `Esplanade::Response::Error` are inherited.
58
65
 
59
- This gem takes a simplified format json convert from API Blueprint which we have called API Tomogram.
66
+ ### Esplanade::Request::Error
60
67
 
61
- If in your project you are using the gem tomograph, then define the configuration you are not required.
68
+ From him the `Esplanade::Request::NotDocumented`, `Esplanade::Request::BodyIsNotJson` and `Esplanade::Request::Invalid` are inherited.
62
69
 
63
- ```ruby
64
- Esplanade.configure do |config|
65
- config.tomogram = 'tomogram.json'
66
- end
67
- ```
70
+ #### Esplanade::Request::NotDocumented
71
+
72
+ Error message: `{:method=>"method", :path=>"path"}`.
73
+
74
+ #### Esplanade::Request::BodyIsNotJson
75
+
76
+ Only if the documentation for this request indicates that `Content-Type: application/json`.
77
+
78
+ Error message: `{:method=>"method", :path=>"path", :body=>"{\"state\": 1"}`.
79
+
80
+ #### Esplanade::Request::Invalid
81
+
82
+ Error message: `{:method=>"method", :path=>"path", :body=>"body", :error=>["error"]}`.
83
+
84
+ ### Esplanade::Response::Error
85
+
86
+ From him the `Esplanade::Response::NotDocumented`, `Esplanade::Response::BodyIsNotJson` and `Esplanade::Response::Invalid` are inherited.
87
+
88
+ #### Esplanade::Response::NotDocumented
89
+
90
+ Error message: `{:request=>{:method=>"method", :path=>"path"}, :status=>"status"}`.
91
+
92
+ #### Esplanade::Response::BodyIsNotJson
93
+
94
+ Only if the documentation for all the responses of one request indicates that `Content-Type: application/json`.
95
+
96
+ Error message: `{:request=>{:method=>"method", :path=>"path"}, :status=>"status", :body=>"body"}`.
97
+
98
+ #### Esplanade::Response::Invalid
99
+
100
+ Error message: `{:request=>{:method=>"method", :path=>"path"}, :status=>"status", :body=>"body", :error=>["error"]}`.
101
+
102
+ ## Config
68
103
 
69
- ### skip_not_documented
104
+ ### apib_path
70
105
 
71
- Default true.
106
+ Path to API Blueprint documentation. There must be an installed [drafter](https://github.com/apiaryio/drafter) to parse it.
72
107
 
73
- ### validation_requests
108
+ ### drafter_yaml_path
74
109
 
75
- Default true.
110
+ Path to API Blueprint documentation pre-parsed with `drafter` and saved to a YAML file.
76
111
 
77
- ### validation_response
112
+ ### prefix
78
113
 
79
- Default true.
114
+ Prefix of API requests. Example: `'/api'`. The prefix is added to the requests in the documentation.
80
115
 
81
116
  ## License
82
117
 
data/esplanade.gemspec CHANGED
@@ -1,4 +1,5 @@
1
1
  # coding: utf-8
2
+
2
3
  lib = File.expand_path('../lib', __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'esplanade/version'
@@ -19,7 +20,7 @@ Gem::Specification.new do |spec|
19
20
 
20
21
  spec.add_runtime_dependency 'multi_json', '~> 1.11', '>= 1.11.1'
21
22
  spec.add_runtime_dependency 'json-schema', '~> 2.6', '>= 2.6.2'
22
- spec.add_runtime_dependency 'tomogram_routing', '~> 0.1', '>= 0.1.0'
23
+ spec.add_runtime_dependency 'tomograph', '~> 1.1', '>= 1.1.0'
23
24
  spec.add_development_dependency 'bundler', '~> 1.12'
24
25
  spec.add_development_dependency 'rake', '~> 10.0'
25
26
  spec.add_development_dependency 'byebug', '~> 8.2', '>= 8.2.1'
data/lib/esplanade.rb CHANGED
@@ -1,13 +1,5 @@
1
1
  require 'esplanade/middleware'
2
2
  require 'esplanade/configuration'
3
- require 'esplanade/request'
4
- require 'esplanade/request/body'
5
- require 'esplanade/request/error'
6
- require 'esplanade/response'
7
- require 'esplanade/response/body'
8
- require 'esplanade/response/error'
9
- require 'esplanade/railtie' if defined?(Rails)
10
- require 'tomogram_routing'
11
3
 
12
4
  module Esplanade
13
5
  class << self
@@ -1,14 +1,11 @@
1
1
  module Esplanade
2
2
  class Configuration
3
- attr_accessor :tomogram,
4
- :skip_not_documented,
5
- :validation_requests,
6
- :validation_response
3
+ attr_accessor :apib_path,
4
+ :drafter_yaml_path,
5
+ :prefix
7
6
 
8
7
  def initialize
9
- @skip_not_documented = true
10
- @validation_requests = true
11
- @validation_response = true
8
+ @prefix = ''
12
9
  end
13
10
  end
14
11
  end
@@ -0,0 +1,3 @@
1
+ module Esplanade
2
+ class Error < RuntimeError; end
3
+ end
@@ -1,33 +1,20 @@
1
- require 'yaml'
1
+ require 'tomograph'
2
+ require 'esplanade/request'
3
+ require 'esplanade/response'
2
4
 
3
5
  module Esplanade
4
6
  class Middleware
5
- class Exit < RuntimeError; end
6
- class ResponseNotDoc < RuntimeError; end
7
-
8
7
  def initialize(app)
9
8
  @app = app
10
- @tomogram = TomogramRouting::Tomogram.craft(Esplanade.configuration.tomogram)
9
+ @documentation = Tomograph::Tomogram.new(
10
+ prefix: Esplanade.configuration.prefix,
11
+ apib_path: Esplanade.configuration.apib_path,
12
+ drafter_yaml_path: Esplanade.configuration.drafter_yaml_path
13
+ )
11
14
  end
12
15
 
13
16
  def call(env)
14
- valid!(env)
15
- rescue Request::NotDocumented
16
- Request::Error.not_documented
17
- rescue Response::NotDocumented
18
- Response::Error.not_documented
19
- rescue Request::Unsuitable => e
20
- Request::Error.unsuitable(e.message)
21
- rescue Response::Unsuitable => e
22
- Response::Error.unsuitable(e.message)
23
- end
24
-
25
- def valid!(env)
26
- request = Request.new(env, @tomogram)
27
- request.valid! if request.validate?
28
17
  status, headers, body = @app.call(env)
29
- response = Response.new(status, body, request.schema)
30
- response.valid! if response.validate?
31
18
  [status, headers, body]
32
19
  end
33
20
  end
@@ -1,31 +1,29 @@
1
- require 'json-schema'
1
+ require 'esplanade/request/doc'
2
+ require 'esplanade/request/raw'
3
+ require 'esplanade/request/validation'
2
4
 
3
5
  module Esplanade
4
6
  class Request
5
- attr_accessor :path, :method, :body, :schema
7
+ class Error < Esplanade::Error; end
8
+ class NotDocumented < Error; end
9
+ class BodyIsNotJson < Error; end
10
+ class Invalid < Error; end
6
11
 
7
- class Unsuitable < RuntimeError; end
8
- class NotDocumented < RuntimeError; end
9
-
10
- def initialize(env, tomogram)
11
- @method = env['REQUEST_METHOD']
12
- @path = env['PATH_INFO']
13
- @body = Body.craft(env)
14
- @schema = tomogram.find_request(method: @method, path: @path)
15
- raise NotDocumented unless schema || Esplanade.configuration.skip_not_documented
16
- self
12
+ def initialize(documentation, env)
13
+ @documentation = documentation
14
+ @env = env
17
15
  end
18
16
 
19
- def error
20
- JSON::Validator.fully_validate(@schema['request'], @body)
17
+ def doc
18
+ @doc ||= Doc.new(@documentation, raw)
21
19
  end
22
20
 
23
- def valid!
24
- raise Unsuitable, error unless error.empty?
21
+ def raw
22
+ @raw ||= Raw.new(@env)
25
23
  end
26
24
 
27
- def validate?
28
- @schema && Esplanade.configuration.validation_requests
25
+ def validation
26
+ @validation || Validation.new(doc, raw)
29
27
  end
30
28
  end
31
29
  end
@@ -0,0 +1,43 @@
1
+ module Esplanade
2
+ class Request
3
+ class Doc
4
+ def initialize(main_documentation, raw)
5
+ @main_documentation = main_documentation
6
+ @raw = raw
7
+ end
8
+
9
+ def tomogram
10
+ @tomogram ||= @main_documentation.find_request(method: @raw.method, path: @raw.path)
11
+ raise NotDocumented, message if @tomogram.nil?
12
+ @tomogram
13
+ end
14
+
15
+ def json_schema
16
+ @json_schema ||= tomogram.request
17
+ end
18
+
19
+ def method
20
+ @method ||= tomogram.method
21
+ end
22
+
23
+ def path
24
+ @path ||= tomogram.path.to_s
25
+ end
26
+
27
+ def responses
28
+ @responses ||= tomogram.responses
29
+ rescue NotDocumented
30
+ []
31
+ end
32
+
33
+ private
34
+
35
+ def message
36
+ {
37
+ method: @raw.method,
38
+ path: @raw.path
39
+ }
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,23 @@
1
+ require 'esplanade/request/raw/body'
2
+
3
+ module Esplanade
4
+ class Request
5
+ class Raw
6
+ def initialize(env)
7
+ @env = env
8
+ end
9
+
10
+ def method
11
+ @method ||= @env['REQUEST_METHOD']
12
+ end
13
+
14
+ def path
15
+ @path ||= @env['PATH_INFO']
16
+ end
17
+
18
+ def body
19
+ @body ||= Body.new(self, @env)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,34 @@
1
+ require 'multi_json'
2
+
3
+ module Esplanade
4
+ class Request
5
+ class Raw
6
+ class Body
7
+ def initialize(raw_request, env)
8
+ @raw_request = raw_request
9
+ @env = env
10
+ end
11
+
12
+ def to_string
13
+ @string ||= @env['rack.request.form_vars']
14
+ end
15
+
16
+ def to_hash
17
+ @hash ||= MultiJson.load(to_string)
18
+ rescue MultiJson::ParseError
19
+ raise BodyIsNotJson, message
20
+ end
21
+
22
+ private
23
+
24
+ def message
25
+ {
26
+ method: @raw_request.method,
27
+ path: @raw_request.path,
28
+ body: to_string
29
+ }
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,29 @@
1
+ require 'json-schema'
2
+ require 'esplanade/error'
3
+
4
+ module Esplanade
5
+ class Request
6
+ class Validation
7
+ def initialize(doc, raw)
8
+ @doc = doc
9
+ @raw = raw
10
+ end
11
+
12
+ def valid!
13
+ @error ||= JSON::Validator.fully_validate(@doc.json_schema, @raw.body.to_hash)
14
+ raise Invalid, message if @error != []
15
+ end
16
+
17
+ private
18
+
19
+ def message
20
+ {
21
+ method: @raw.method,
22
+ path: @raw.path,
23
+ body: @raw.body.to_string,
24
+ error: @error
25
+ }
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,38 +1,32 @@
1
- require 'json-schema'
1
+ require 'esplanade/response/doc'
2
+ require 'esplanade/response/raw'
3
+ require 'esplanade/response/validation'
2
4
 
3
5
  module Esplanade
4
6
  class Response
5
- attr_accessor :status, :body, :schemas
7
+ class Error < Esplanade::Error; end
8
+ class NotDocumented < Error; end
9
+ class BodyIsNotJson < Error; end
10
+ class Invalid < Error; end
6
11
 
7
- class Unsuitable < RuntimeError; end
8
- class NotDocumented < RuntimeError; end
12
+ attr_reader :request
9
13
 
10
- def initialize(status, body, expect_request)
11
- return unless Esplanade.configuration.validation_response && expect_request
14
+ def initialize(request, status, raw_body)
15
+ @request = request
12
16
  @status = status
13
- @body = Body.craft(body)
14
- @schemas = expect_request.find_responses(status: @status)
15
- raise NotDocumented unless (@schemas&.first) || Esplanade.configuration.skip_not_documented
16
- self
17
+ @raw_body = raw_body
17
18
  end
18
19
 
19
- def error
20
- return JSON::Validator.fully_validate(@schemas.first['body'], @body) if @schemas.size == 1
21
-
22
- @schemas.each do |action|
23
- res = JSON::Validator.fully_validate(action['body'], @body)
24
- return res if res == []
25
- end
26
-
27
- ['invalid']
20
+ def doc
21
+ @doc ||= Doc.new(@request, raw)
28
22
  end
29
23
 
30
- def valid!
31
- raise Unsuitable, error unless error.empty?
24
+ def raw
25
+ @raw ||= Raw.new(@request, @status, @raw_body)
32
26
  end
33
27
 
34
- def validate?
35
- @schemas&.first && Esplanade.configuration.validation_response
28
+ def validation
29
+ @validation ||= Validation.new(@request, doc, raw)
36
30
  end
37
31
  end
38
32
  end
@@ -0,0 +1,36 @@
1
+ module Esplanade
2
+ class Response
3
+ class Doc
4
+ def initialize(request, raw)
5
+ @request = request
6
+ @raw = raw
7
+ end
8
+
9
+ def tomogram
10
+ @tomogram ||= @request.doc.responses.find_all { |response| response['status'] == @raw.status }
11
+ raise NotDocumented, message if @tomogram == []
12
+ @tomogram
13
+ end
14
+
15
+ def json_schemas
16
+ @json_schemas ||= tomogram.map { |action| action['body'] }
17
+ end
18
+
19
+ def status
20
+ @status ||= tomogram['status']
21
+ end
22
+
23
+ private
24
+
25
+ def message
26
+ {
27
+ request: {
28
+ method: @request.raw.method,
29
+ path: @request.raw.path
30
+ },
31
+ status: @raw.status
32
+ }
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,21 @@
1
+ require 'esplanade/response/raw/body'
2
+
3
+ module Esplanade
4
+ class Response
5
+ class Raw
6
+ def initialize(request, raw_status, raw_body)
7
+ @request = request
8
+ @raw_status = raw_status
9
+ @raw_body = raw_body
10
+ end
11
+
12
+ def status
13
+ @status ||= @raw_status.to_s
14
+ end
15
+
16
+ def body
17
+ @body ||= Body.new(@request, self, @raw_body)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,39 @@
1
+ require 'multi_json'
2
+
3
+ module Esplanade
4
+ class Response
5
+ class Raw
6
+ class Body
7
+ def initialize(request, raw_response, raw_body)
8
+ @request = request
9
+ @raw_response = raw_response
10
+ @raw_body = raw_body
11
+ end
12
+
13
+ def to_string
14
+ @string ||= @raw_body.body rescue nil
15
+ @string ||= @raw_body.first rescue nil
16
+ end
17
+
18
+ def to_hash
19
+ @hash ||= MultiJson.load(to_string)
20
+ rescue MultiJson::ParseError
21
+ raise BodyIsNotJson, message
22
+ end
23
+
24
+ private
25
+
26
+ def message
27
+ {
28
+ request: {
29
+ method: @request.raw.method,
30
+ path: @request.raw.path
31
+ },
32
+ status: @raw_response.status,
33
+ body: @raw_response.body.to_string
34
+ }
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,52 @@
1
+ require 'json-schema'
2
+
3
+ module Esplanade
4
+ class Response
5
+ class Validation
6
+ def initialize(request, doc, raw)
7
+ @request = request
8
+ @doc = doc
9
+ @raw = raw
10
+ end
11
+
12
+ def valid!
13
+ @error ||= if @doc.json_schemas.size == 1
14
+ one_json_schema
15
+ else
16
+ more_than_one_json_schema
17
+ end
18
+ raise Invalid, message if @error != []
19
+ end
20
+
21
+ private
22
+
23
+ def one_json_schema
24
+ JSON::Validator.fully_validate(@doc.json_schemas.first, @raw.body.to_hash)
25
+ end
26
+
27
+ def more_than_one_json_schema
28
+ main_res = @doc.json_schemas.each do |json_schema|
29
+ res = JSON::Validator.fully_validate(json_schema, @raw.body.to_hash)
30
+ break res if res == []
31
+ end
32
+ if main_res != []
33
+ ['invalid']
34
+ else
35
+ []
36
+ end
37
+ end
38
+
39
+ def message
40
+ {
41
+ request: {
42
+ method: @request.raw.method,
43
+ path: @request.raw.path
44
+ },
45
+ status: @raw.status,
46
+ body: @raw.body.to_string,
47
+ error: @error
48
+ }
49
+ end
50
+ end
51
+ end
52
+ end
@@ -1,3 +1,3 @@
1
1
  module Esplanade
2
- VERSION = '0.1.0'.freeze
2
+ VERSION = '1.0.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: esplanade
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - d.efimov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-02-06 00:00:00.000000000 Z
11
+ date: 2017-10-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: multi_json
@@ -51,25 +51,25 @@ dependencies:
51
51
  - !ruby/object:Gem::Version
52
52
  version: 2.6.2
53
53
  - !ruby/object:Gem::Dependency
54
- name: tomogram_routing
54
+ name: tomograph
55
55
  requirement: !ruby/object:Gem::Requirement
56
56
  requirements:
57
57
  - - "~>"
58
58
  - !ruby/object:Gem::Version
59
- version: '0.1'
59
+ version: '1.1'
60
60
  - - ">="
61
61
  - !ruby/object:Gem::Version
62
- version: 0.1.0
62
+ version: 1.1.0
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
- version: '0.1'
69
+ version: '1.1'
70
70
  - - ">="
71
71
  - !ruby/object:Gem::Version
72
- version: 0.1.0
72
+ version: 1.1.0
73
73
  - !ruby/object:Gem::Dependency
74
74
  name: bundler
75
75
  requirement: !ruby/object:Gem::Requirement
@@ -188,6 +188,7 @@ files:
188
188
  - ".gitignore"
189
189
  - ".rubocop.yml"
190
190
  - ".ruby-version"
191
+ - ".travis.yml"
191
192
  - CODE_OF_CONDUCT.md
192
193
  - Gemfile
193
194
  - LICENSE.txt
@@ -198,14 +199,18 @@ files:
198
199
  - esplanade.gemspec
199
200
  - lib/esplanade.rb
200
201
  - lib/esplanade/configuration.rb
202
+ - lib/esplanade/error.rb
201
203
  - lib/esplanade/middleware.rb
202
- - lib/esplanade/railtie.rb
203
204
  - lib/esplanade/request.rb
204
- - lib/esplanade/request/body.rb
205
- - lib/esplanade/request/error.rb
205
+ - lib/esplanade/request/doc.rb
206
+ - lib/esplanade/request/raw.rb
207
+ - lib/esplanade/request/raw/body.rb
208
+ - lib/esplanade/request/validation.rb
206
209
  - lib/esplanade/response.rb
207
- - lib/esplanade/response/body.rb
208
- - lib/esplanade/response/error.rb
210
+ - lib/esplanade/response/doc.rb
211
+ - lib/esplanade/response/raw.rb
212
+ - lib/esplanade/response/raw/body.rb
213
+ - lib/esplanade/response/validation.rb
209
214
  - lib/esplanade/version.rb
210
215
  homepage:
211
216
  licenses:
@@ -227,7 +232,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
227
232
  version: '0'
228
233
  requirements: []
229
234
  rubyforge_project:
230
- rubygems_version: 2.5.1
235
+ rubygems_version: 2.4.5
231
236
  signing_key:
232
237
  specification_version: 4
233
238
  summary: Validate requests and responses against API Blueprint specifications
@@ -1,7 +0,0 @@
1
- module Esplanade
2
- class Railtie < Rails::Railtie
3
- initializer 'esplanade.insert_middleware' do |app|
4
- app.config.middleware.use Esplanade::Middleware
5
- end
6
- end
7
- end
@@ -1,14 +0,0 @@
1
- module Esplanade
2
- class Request
3
- class Body < Hash
4
- private_class_method :new
5
-
6
- def self.craft(env)
7
- params_string = env['rack.input'].read
8
- params_hash = {}
9
- params_hash = MultiJson.load(params_string) unless params_string == ''
10
- new.merge(params_hash)
11
- end
12
- end
13
- end
14
- end
@@ -1,19 +0,0 @@
1
- module Esplanade
2
- class Request
3
- class Error
4
- def self.unsuitable(message)
5
- status = '400'
6
- headers = { 'Content-Type' => 'application/json; charset=utf-8' }
7
- body = [MultiJson.dump(error: [message[2..-3]])]
8
- [status, headers, body]
9
- end
10
-
11
- def self.not_documented
12
- status = '400'
13
- headers = { 'Content-Type' => 'application/json; charset=utf-8' }
14
- body = [MultiJson.dump(error: ['Not documented'])]
15
- [status, headers, body]
16
- end
17
- end
18
- end
19
- end
@@ -1,32 +0,0 @@
1
- module Esplanade
2
- class Response
3
- class Body < Hash
4
- class << self
5
- private_class_method :new
6
-
7
- def craft(body)
8
- # According to specification Rack http://rack.github.io
9
- # body can only answer each
10
- lines = []
11
- body.each { |line| lines.push(line) }
12
- lines_to_json(lines)
13
- end
14
-
15
- private
16
-
17
- def lines_to_json(lines)
18
- if lines.join.empty?
19
- {}
20
- else
21
- res = lines.join('\n')
22
- begin
23
- MultiJson.load(res)
24
- rescue MultiJson::ParseError
25
- res
26
- end
27
- end
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,19 +0,0 @@
1
- module Esplanade
2
- class Response
3
- class Error
4
- def self.unsuitable(message)
5
- status = '500'
6
- headers = { 'Content-Type' => 'application/json; charset=utf-8' }
7
- body = [MultiJson.dump(error: [message[2..-3]])]
8
- [status, headers, body]
9
- end
10
-
11
- def self.not_documented
12
- status = '500'
13
- headers = { 'Content-Type' => 'application/json; charset=utf-8' }
14
- body = [MultiJson.dump(error: ['Not documented'])]
15
- [status, headers, body]
16
- end
17
- end
18
- end
19
- end