fitting 0.4.2 → 1.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b691110010526d218502ab3a96d72d42c2f7b7ee
4
- data.tar.gz: 22970b49d14ae1a301104accc9eacd00c36cdafe
3
+ metadata.gz: 3fd051bc55d0a84202300a746cb5c75041440924
4
+ data.tar.gz: a6be0e42f772ea7dd5505dc46a0eee5b68b90c29
5
5
  SHA512:
6
- metadata.gz: 739fd734d8ff748bbd7e3dbe5f55e8d402b1abb6493872e92b9ba1ddcbb77c145f4f388b52aed0a3c8a5a6b8560cb5646640e0905c980b0e3f2a67d7562e070f
7
- data.tar.gz: 3990b73d16072cdb1f2a570d7c1ed2efc0c9b31e9e5f3322b789d5e08546de29e368edd93b4ecf4e4deea70a9c5bde9de7fb8445e829db055f80f019ba8909bb
6
+ metadata.gz: 2fe0cb6d71f87702f48a83573732f515aa673d616e32f92b479144129423129aca0bb9bbfca65672fa55f9cc695e58fdeea07e038af99a88db70e0fa2706ec77
7
+ data.tar.gz: 6f5bdefbe659626a84a41b7682fe0edfb90a7dbb7f3768e7ad55d36787d53e2fa4e422544538b2f186e2e1235c909ae263f751ac055c147c56d24b490ee774a1
data/.gitignore CHANGED
@@ -9,5 +9,3 @@
9
9
  /tmp/
10
10
  .idea/
11
11
  .byebug_history
12
- report_response_macro.yaml
13
- report_response_micro.yaml
data/README.md CHANGED
@@ -24,34 +24,11 @@ Or install it yourself as:
24
24
 
25
25
  ## Usage
26
26
 
27
- ### rspec-rails
28
-
29
- rails_helper.rb
27
+ In your `spec_helper.rb`:
30
28
 
31
29
  ```ruby
32
- require 'fitting'
33
- config.after(:each, :type => :controller) do
34
- Fitting::Documentation.try_on(self, request, response)
35
- end
36
- ```
37
-
38
- ### Formatting
39
-
40
- ```
41
- bundle exec rspec --format Fitting::Formatter::Response::MacroYaml
42
- ```
43
-
44
- or
45
-
30
+ config.include JSON::SchemaMatchers
46
31
  ```
47
- bundle exec rspec --format Fitting::Formatter::Response::MicroYaml
48
- ```
49
-
50
- After that you can find the report in `report_response_macro.yaml` or `report_response_micro.yaml`.
51
-
52
- ## Config
53
-
54
- ### tomogram
55
32
 
56
33
  This gem takes a simplified format json convert from API Blueprint which we have called API Tomogram.
57
34
 
@@ -64,17 +41,23 @@ Use gem [tomograph](https://github.com/funbox/tomograph)
64
41
 
65
42
  ```
66
43
 
67
- ### skip_not_documented
44
+ You can then write tests such as:
68
45
 
69
- Default true.
46
+ ```ruby
47
+ expect(response).to match_response
48
+ ```
70
49
 
71
- ### validation_requests
50
+ If you want check all tests:
72
51
 
73
- Default true.
52
+ ```ruby
53
+ config.after(:each, :type => :controller) do
54
+ expect(response).to match_response
55
+ end
56
+ ```
74
57
 
75
- ### validation_response
58
+ ## Report
76
59
 
77
- Default true.
60
+ Autogenerate `report_request_by_response.yaml` and `report_response.yaml reports`.
78
61
 
79
62
  ## Contributing
80
63
 
data/lib/fitting.rb CHANGED
@@ -1,6 +1,11 @@
1
1
  require 'fitting/version'
2
- require 'fitting/documentation'
3
2
  require 'fitting/configuration'
3
+ require 'fitting/documentation/response/route'
4
+ require 'fitting/documentation/request/route'
5
+ require 'fitting/storage/responses'
6
+ require 'fitting/storage/documentation'
7
+ require 'fitting/report/response'
8
+ require 'fitting/matchers/response_matcher'
4
9
 
5
10
  module Fitting
6
11
  class << self
@@ -13,3 +18,26 @@ module Fitting
13
18
  end
14
19
  end
15
20
  end
21
+
22
+ module RSpec
23
+ module Core
24
+ # Provides the main entry point to run a suite of RSpec examples.
25
+ class Runner
26
+ alias origin_run_specs run_specs
27
+
28
+ def run_specs(example_groups)
29
+ origin_run_specs(example_groups)
30
+ return if Fitting::Storage::Responses.nil?
31
+
32
+ response_routes = Fitting::Documentation::Response::Route.new(
33
+ Fitting::Storage::Documentation.hash,
34
+ Fitting::Storage::Responses.all
35
+ )
36
+ request_routes = Fitting::Documentation::Request::Route.new(response_routes)
37
+ puts "Coverage documentation API (responses) by RSpec tests: #{response_routes.cover_ratio}%"
38
+ Fitting::Report::Response.new('report_response.yaml', response_routes).save
39
+ Fitting::Report::Response.new('report_request_by_response.yaml', request_routes).save
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,14 +1,5 @@
1
1
  module Fitting
2
2
  class Configuration
3
- attr_accessor :tomogram,
4
- :skip_not_documented,
5
- :validation_requests,
6
- :validation_response
7
-
8
- def initialize
9
- @skip_not_documented = true
10
- @validation_requests = true
11
- @validation_response = true
12
- end
3
+ attr_accessor :tomogram
13
4
  end
14
5
  end
@@ -0,0 +1,57 @@
1
+ require 'multi_json'
2
+
3
+ module Fitting
4
+ module Documentation
5
+ module Request
6
+ class Route
7
+ def initialize(response_routes)
8
+ @response_routes = response_routes
9
+ end
10
+
11
+ def coverage_statistic
12
+ stat = {}
13
+ @response_routes.coverage.map do |route|
14
+ macro_key = route.split(' ')[0..1].join(' ')
15
+ micro_key = route.split(' ')[2..3].join(' ')
16
+ stat[macro_key] ||= {}
17
+ stat[macro_key]['cover'] ||= []
18
+ stat[macro_key]['not_cover'] ||= []
19
+ stat[macro_key]['cover'].push(micro_key)
20
+ end
21
+ @response_routes.not_coverage.map do |route|
22
+ macro_key = route.split(' ')[0..1].join(' ')
23
+ micro_key = route.split(' ')[2..3].join(' ')
24
+ stat[macro_key] ||= {}
25
+ stat[macro_key]['cover'] ||= []
26
+ stat[macro_key]['not_cover'] ||= []
27
+ stat[macro_key]['not_cover'].push(micro_key)
28
+ end
29
+ @stat = stat.inject(
30
+ {
31
+ 'full cover' => [],
32
+ 'partial cover' => [],
33
+ 'no cover' => []
34
+ }
35
+ ) do |res, date|
36
+ ratio = date.last['cover_ratio'] =
37
+ (date.last['cover'].size.to_f /
38
+ (date.last['cover'].size + date.last['not_cover'].size).to_f * 100.0).round(2)
39
+ info = {date.first => {'cover' => date.last['cover'], 'not_cover' => date.last['not_cover']}}
40
+ if ratio == 100.0
41
+ res['full cover'].push(info)
42
+ elsif ratio == 0.0
43
+ res['no cover'].push(info)
44
+ else
45
+ res['partial cover'].push(info)
46
+ end
47
+ res
48
+ end
49
+ end
50
+
51
+ def to_hash
52
+ @stat ||= coverage_statistic
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,51 @@
1
+ require 'multi_json'
2
+
3
+ module Fitting
4
+ module Documentation
5
+ module Response
6
+ class Route
7
+ def initialize(tomogram, coverage_responses)
8
+ @tomogram = tomogram
9
+ @coverage_responses = coverage_responses
10
+ end
11
+
12
+ def coverage
13
+ @coverage ||= @coverage_responses.map do |response|
14
+ response.route if response.documented? && response.valid?
15
+ end.compact.uniq
16
+ end
17
+
18
+ def not_coverage
19
+ @not_coverage ||= all - coverage
20
+ end
21
+
22
+ def all
23
+ @all ||= MultiJson.load(@tomogram).inject([]) do |routes, request|
24
+ request['responses'].inject({}) do |responses, response|
25
+ responses[response['status']] ||= 0
26
+ responses[response['status']] += 1
27
+ responses
28
+ end.map do |status, indexes|
29
+ indexes.times do |index|
30
+ route = "#{request['method']} #{request['path']} #{status} #{index}"
31
+ routes.push(route)
32
+ end
33
+ end
34
+ routes
35
+ end.uniq
36
+ end
37
+
38
+ def cover_ratio
39
+ @cover_ratio ||= (coverage.size.to_f / all.size.to_f * 100.0).round(2)
40
+ end
41
+
42
+ def to_hash
43
+ {
44
+ 'coverage' => coverage,
45
+ 'not coverage' => not_coverage
46
+ }
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,40 @@
1
+ require 'fitting/response'
2
+ require 'fitting/storage/responses'
3
+ require 'fitting/storage/documentation'
4
+
5
+ module Fitting
6
+ module Matchers
7
+ class Response
8
+ def matches?(response)
9
+ @response = Fitting::Response.new(
10
+ response,
11
+ Fitting::Storage::Documentation.tomogram
12
+ )
13
+ Fitting::Storage::Responses.push(@response)
14
+ @response.valid?
15
+ end
16
+
17
+ def ===(other)
18
+ matches?(other)
19
+ end
20
+
21
+ def failure_message
22
+ unless @response.documented?
23
+ return "response not documented\n"\
24
+ "got: #{@response.real_request_with_status}"
25
+ end
26
+
27
+ unless @response.valid?
28
+ "response not valid json-schema\n"\
29
+ "got: #{@response.got}\n"\
30
+ "diff: \n#{@response.diff}"\
31
+ "expected: \n#{@response.expected}\n"
32
+ end
33
+ end
34
+ end
35
+
36
+ def match_response
37
+ Response.new
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,18 @@
1
+ require 'yaml'
2
+
3
+ module Fitting
4
+ module Report
5
+ class Response
6
+ def initialize(name, routes)
7
+ @name = name
8
+ @json = routes.to_hash
9
+ end
10
+
11
+ def save
12
+ File.open(@name, 'w') do |file|
13
+ file.write(YAML.dump(@json))
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,35 +1,32 @@
1
+ require 'json-schema'
2
+
1
3
  module Fitting
2
4
  class Request
3
- attr_accessor :path, :method, :body, :schema
4
-
5
- class Unsuitable < RuntimeError; end
6
- class NotDocumented < RuntimeError; end
7
-
8
5
  def initialize(env_request, tomogram)
9
6
  @method = env_request.request_method
10
7
  @path = env_request.env['PATH_INFO']
11
8
  @body = env_request.env['action_dispatch.request.request_parameters']
12
9
  @schema = tomogram.find_request(method: @method, path: @path)
13
- raise NotDocumented unless @schema || Fitting.configuration.skip_not_documented
10
+ @fully_validate = JSON::Validator.fully_validate(@schema['request'], @body) if @schema
11
+ @valid = false
12
+ @valid = true if @fully_validate == []
14
13
  self
15
14
  end
16
15
 
17
- def valid!
18
- res = JSON::Validator.fully_validate(@schema['request'], @body)
19
- raise Unsuitable unless res.empty?
16
+ def route
17
+ "#{@schema['method']} #{@schema['path']}"
20
18
  end
21
19
 
22
- def validate?
23
- @schema && Fitting.configuration.validation_requests
20
+ def real_method_with_path
21
+ "#{@method} #{@path}"
24
22
  end
25
23
 
26
- def to_hash
27
- {
28
- 'method' => @method,
29
- 'path' => @path,
30
- 'body' => @body,
31
- 'schema' => @schema
32
- }
24
+ def schemas_of_possible_responses(status:)
25
+ if @schema
26
+ @schema.find_responses(status: status).map do |response|
27
+ response['body']
28
+ end
29
+ end
33
30
  end
34
31
  end
35
32
  end
@@ -1,21 +1,14 @@
1
+ require 'fitting/request'
2
+ require 'json-schema'
3
+
1
4
  module Fitting
2
5
  class Response
3
- attr_accessor :status, :body, :schemas
4
-
5
- class Unsuitable < RuntimeError; end
6
- class NotDocumented < RuntimeError; end
7
-
8
- def initialize(env_response, expect_request)
6
+ def initialize(env_response, tomogram)
7
+ @request = Request.new(env_response.request, tomogram)
9
8
  @status = env_response.status
10
9
  @body = env_response.body
11
- @schemas = expect_request.find_responses(status: @status).map{|response|response['body']} if expect_request
10
+ @schemas = @request.schemas_of_possible_responses(status: @status)
12
11
  @fully_validates = set_fully_validate if @schemas
13
- raise Response::NotDocumented unless (@schemas && @schemas.first) || Fitting.configuration.skip_not_documented
14
- self
15
- end
16
-
17
- def valid!
18
- raise Unsuitable unless @valid
19
12
  end
20
13
 
21
14
  def set_fully_validate
@@ -29,18 +22,46 @@ module Fitting
29
22
  fully_validates
30
23
  end
31
24
 
32
- def validate?
33
- @schemas && @schemas.first && Fitting.configuration.validation_response
25
+ def documented?
26
+ @schemas && @schemas.present?
27
+ end
28
+
29
+ def valid?
30
+ @valid == true
31
+ end
32
+
33
+ def route
34
+ "#{@request.route} #{@status} #{index}"
35
+ end
36
+
37
+ def real_request_with_status
38
+ "#{@request.real_method_with_path} #{@status}"
34
39
  end
35
40
 
36
- def to_hash
37
- {
38
- 'status' => @status,
39
- 'body' => @body,
40
- 'schemas' => @schemas,
41
- 'fully_validates' => @fully_validates,
42
- 'valid' => @valid
43
- }
41
+ def got
42
+ @body
43
+ end
44
+
45
+ def diff
46
+ @fully_validates.inject("") do |res, fully_validate|
47
+ res + "#{fully_validate}\n"
48
+ end
49
+ end
50
+
51
+ def expected
52
+ @schemas.inject("") do |res, schema|
53
+ res + "#{schema}\n"
54
+ end
55
+ end
56
+
57
+ private
58
+
59
+ def index
60
+ @schemas.size.times do |i|
61
+ if @fully_validates[i] == []
62
+ return i
63
+ end
64
+ end
44
65
  end
45
66
  end
46
67
  end
@@ -0,0 +1,17 @@
1
+ require 'tomogram_routing'
2
+
3
+ module Fitting
4
+ module Storage
5
+ module Documentation
6
+ class << self
7
+ def tomogram
8
+ @tomogram ||= TomogramRouting::Tomogram.craft(hash)
9
+ end
10
+
11
+ def hash
12
+ Fitting.configuration.tomogram
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,21 @@
1
+ module Fitting
2
+ module Storage
3
+ module Responses
4
+ class << self
5
+ def push(test)
6
+ @responses ||= []
7
+ @responses.push(test)
8
+ end
9
+
10
+ def all
11
+ @responses ||= []
12
+ @responses.uniq
13
+ end
14
+
15
+ def nil?
16
+ @responses.nil?
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,3 +1,3 @@
1
1
  module Fitting
2
- VERSION = '0.4.2'.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: fitting
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
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-09 00:00:00.000000000 Z
11
+ date: 2017-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json-schema
@@ -192,15 +192,14 @@ files:
192
192
  - fitting.gemspec
193
193
  - lib/fitting.rb
194
194
  - lib/fitting/configuration.rb
195
- - lib/fitting/documentation.rb
196
- - lib/fitting/formatter/response/macro_yaml.rb
197
- - lib/fitting/formatter/response/micro_yaml.rb
198
- - lib/fitting/report/response/macro.rb
199
- - lib/fitting/report/response/micro.rb
195
+ - lib/fitting/documentation/request/route.rb
196
+ - lib/fitting/documentation/response/route.rb
197
+ - lib/fitting/matchers/response_matcher.rb
198
+ - lib/fitting/report/response.rb
200
199
  - lib/fitting/request.rb
201
200
  - lib/fitting/response.rb
202
- - lib/fitting/storage/json_file.rb
203
- - lib/fitting/storage/yaml_file.rb
201
+ - lib/fitting/storage/documentation.rb
202
+ - lib/fitting/storage/responses.rb
204
203
  - lib/fitting/version.rb
205
204
  homepage: https://github.com/funbox/fitting
206
205
  licenses:
@@ -1,42 +0,0 @@
1
- require 'tomogram_routing'
2
- require 'json-schema'
3
- require 'fitting/storage/yaml_file'
4
- require 'fitting/request'
5
- require 'fitting/response'
6
-
7
- module Fitting
8
- class Documentation
9
- class << self
10
- def try_on(date, env_request, env_response)
11
- request = Request.new(env_request, tomogram)
12
- request.valid! if request.validate?
13
- response = Response.new(env_response, request.schema)
14
- response.valid! if response.validate?
15
- add_storage(location(date), request, response)
16
- end
17
-
18
- private
19
-
20
- def add_storage(location, request, response)
21
- Fitting::Storage::YamlFile.push(
22
- location,
23
- 'request' => MultiJson.dump(request.to_hash),
24
- 'response' => MultiJson.dump(response.to_hash)
25
- )
26
- end
27
-
28
- def tomogram
29
- @tomogram ||= TomogramRouting::Tomogram.craft(Fitting.configuration.tomogram)
30
- end
31
-
32
- def location(date)
33
- name = date.inspect.to_s
34
- if name.split('(').size > 1
35
- name.split('(').last.split(')').first[2..-1]
36
- else
37
- name.split(' ')[3][2..-3]
38
- end
39
- end
40
- end
41
- end
42
- end
@@ -1,36 +0,0 @@
1
- require 'rspec/core/formatters/base_formatter'
2
- require 'yaml'
3
- require 'fitting/storage/yaml_file'
4
- require 'fitting/report/response/macro'
5
-
6
- module Fitting
7
- module Formatter
8
- module Response
9
- class MacroYaml < RSpec::Core::Formatters::BaseFormatter
10
- RSpec::Core::Formatters.register self, :start, :stop
11
-
12
- def start(_notification)
13
- Fitting::Storage::YamlFile.craft
14
- end
15
-
16
- def stop(_notification)
17
- tests = Fitting::Storage::YamlFile.load
18
- Fitting::Storage::YamlFile.destroy
19
-
20
- if tests
21
- report = Report::Response::Macro.new(tests).to_hash
22
- else
23
- report = 'no tests controllers'
24
- end
25
- craft_json(report)
26
- end
27
-
28
- def craft_json(report)
29
- File.open('report_response_macro.yaml', 'w') do |file|
30
- file.write(YAML.dump(report))
31
- end
32
- end
33
- end
34
- end
35
- end
36
- end
@@ -1,36 +0,0 @@
1
- require 'rspec/core/formatters/base_formatter'
2
- require 'yaml'
3
- require 'fitting/storage/yaml_file'
4
- require 'fitting/report/response/micro'
5
-
6
- module Fitting
7
- module Formatter
8
- module Response
9
- class MicroYaml < RSpec::Core::Formatters::BaseFormatter
10
- RSpec::Core::Formatters.register self, :start, :stop
11
-
12
- def start(_notification)
13
- Fitting::Storage::YamlFile.craft
14
- end
15
-
16
- def stop(_notification)
17
- tests = Fitting::Storage::YamlFile.load
18
- Fitting::Storage::YamlFile.destroy
19
-
20
- if tests
21
- report = Report::Response::Micro.new(tests).to_hash
22
- else
23
- report = 'no tests controllers'
24
- end
25
- craft_json(report)
26
- end
27
-
28
- def craft_json(report)
29
- File.open('report_response_micro.yaml', 'w') do |file|
30
- file.write(YAML.dump(report))
31
- end
32
- end
33
- end
34
- end
35
- end
36
- end
@@ -1,89 +0,0 @@
1
- module Fitting
2
- module Report
3
- module Response
4
- class Macro
5
- def initialize(tests)
6
- @json = responses(tests)
7
- end
8
-
9
- def responses(tests)
10
- data = {
11
- 'not_documented' => {},
12
- 'invalid' => {},
13
- 'valid' => {}
14
- }
15
- full_responses = {}
16
-
17
- tests.map do |location, test|
18
- request = MultiJson.load(test['request'])
19
- response = MultiJson.load(test['response'])
20
- if request['schema'].nil?
21
- data['not_documented'][response_key(request, response)] = [location]
22
- else
23
- if response['schemas'].nil?
24
- data['not_documented'][response_key(request['schema'], response)] = [location]
25
- else
26
- responses_documented(location, response['valid'], data, response_key(request['schema'], response), full_responses, response)
27
- end
28
- end
29
- end
30
-
31
- not_cover = {}
32
- full_responses.map do |response, date|
33
- date['cases'].map do |one_case|
34
- if not_cover["#{response} #{one_case}"]
35
- not_cover["#{response} #{one_case}"] = not_cover["#{response} #{one_case}"] + [date['test']]
36
- else
37
- not_cover["#{response} #{one_case}"] = [date['test']]
38
- end
39
- end
40
- end
41
- data['not_cover_where_either'] = not_cover
42
- data
43
- end
44
-
45
- def responses_documented(location, valid, data, name, full_responses, response)
46
- if valid
47
- unless full_responses[name]
48
- full_responses[name] = {}
49
- full_responses[name]['cases'] = (0..response['schemas'].size-1).to_a
50
- end
51
- full_responses[name]['test'] = location
52
- full_responses[name]['cases'].delete(find_index(response))
53
- push('valid', data, "#{name} #{find_index(response)}", location)
54
- else
55
- push('invalid', data, name, location)
56
- end
57
- end
58
-
59
- def find_index(response)
60
- response['schemas'].size.times do |i|
61
- if response['fully_validates'][i] == []
62
- return i
63
- end
64
- end
65
- end
66
-
67
- def push(key, data, name, location)
68
- data[key] = if data[key][name]
69
- data[key].merge(name => data[key][name] + [location])
70
- else
71
- data[key].merge(name => [location])
72
- end
73
- end
74
-
75
- def request_key(request_data)
76
- "#{request_data['method']} #{request_data['path']}"
77
- end
78
-
79
- def response_key(request_data, response_data)
80
- "#{request_key(request_data)} #{response_data['status']}"
81
- end
82
-
83
- def to_hash
84
- @json
85
- end
86
- end
87
- end
88
- end
89
- end
@@ -1,76 +0,0 @@
1
- require 'multi_json'
2
-
3
- module Fitting
4
- module Report
5
- module Response
6
- class Micro
7
- def initialize(tests)
8
- @json = responses(tests)
9
- end
10
-
11
- def responses(tests)
12
- data = {}
13
-
14
- tests.map do |location, test|
15
- request = MultiJson.load(test['request'])
16
- response = MultiJson.load(test['response'])
17
- if request['schema'].nil?
18
- data[location] = {
19
- 'status' => 'not_documented',
20
- 'got' => response['body']
21
- }
22
- else
23
- if response['schemas'].nil?
24
- data[location] = {
25
- 'status' => 'not_documented',
26
- 'got' => response['body']
27
- }
28
- else
29
- responses_documented(location, data, response)
30
- end
31
- end
32
- end
33
-
34
- data
35
- end
36
-
37
- def responses_documented(location, data, response)
38
- if response['valid']
39
- expect_body = {}
40
-
41
- response['schemas'].size.times do |i|
42
- if response['fully_validates'][i] == []
43
- expect_body = response['schemas'][i]
44
- end
45
- end
46
-
47
- data[location] = {
48
- 'status' => 'valid',
49
- 'got' => response['body'],
50
- 'expect' => MultiJson.dump(expect_body)
51
- }
52
- else
53
- fully_validates = response['fully_validates'].map do |fully_validate|
54
- MultiJson.dump(fully_validate)
55
- end
56
-
57
- schemas = response['schemas'].map do |schema|
58
- MultiJson.dump(schema)
59
- end
60
-
61
- data[location] = {
62
- 'status' => 'invalid',
63
- 'got' => response['body'],
64
- 'diff' => fully_validates,
65
- 'expected' => schemas
66
- }
67
- end
68
- end
69
-
70
- def to_hash
71
- @json
72
- end
73
- end
74
- end
75
- end
76
- end
@@ -1,37 +0,0 @@
1
- require 'multi_json'
2
-
3
- module Fitting
4
- module Storage
5
- class JsonFile
6
- NAME = 'storage.json'.freeze
7
-
8
- def self.craft
9
- save({})
10
- end
11
-
12
- def self.save(json)
13
- File.open(NAME, 'w') do |file|
14
- file.write(MultiJson.dump(json))
15
- end
16
- end
17
-
18
- def self.push(key, value)
19
- save(tests.merge(key => value))
20
- rescue
21
- end
22
-
23
- def self.tests
24
- MultiJson.load(File.read(NAME))
25
- rescue
26
- end
27
-
28
- def self.load
29
- MultiJson.load(File.read(NAME))
30
- end
31
-
32
- def self.destroy
33
- File.delete(NAME)
34
- end
35
- end
36
- end
37
- end
@@ -1,37 +0,0 @@
1
- require 'yaml'
2
-
3
- module Fitting
4
- module Storage
5
- class YamlFile
6
- NAME = 'storage.yaml'.freeze
7
-
8
- def self.craft
9
- save("---\n")
10
- end
11
-
12
- def self.save(json)
13
- File.open(NAME, 'w') do |file|
14
- file.write(json)
15
- end
16
- end
17
-
18
- def self.push(key, value)
19
- save(tests + YAML.dump(key => value)[4..-1])
20
- rescue
21
- end
22
-
23
- def self.tests
24
- File.read(NAME)
25
- rescue
26
- end
27
-
28
- def self.load
29
- YAML.load(File.read(NAME))
30
- end
31
-
32
- def self.destroy
33
- File.delete(NAME)
34
- end
35
- end
36
- end
37
- end