azeroth 0.4.0 → 0.5.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
  SHA256:
3
- metadata.gz: 7b900f12e602cd5e71dcb0384e0d4edf783a699a9462dd644d849ec52af171f1
4
- data.tar.gz: c9212340df4b356fb223874e340a3679111d0dd1d80b4e0293d7b3f7afebb790
3
+ metadata.gz: 12fa0ab1ef082540f0c7d7bdedf2ed52c3b9bdce5655d15ea45779be34c1cbe0
4
+ data.tar.gz: 7b9e0ce7be0223f0e2d9797197160f30ec1113d48cb9375ad650846d4f1ae481
5
5
  SHA512:
6
- metadata.gz: c884137cfce1ae2e0fac3a35817ecfecb62dc1093a7b95c5f77a8d9fffb426b0b7024028221789b6b560097bcae07a8012ef751edd3c9a08941a1ab6d4890e7d
7
- data.tar.gz: 63ca6a97a61293b3551852ac2fab43ce0ab27fe9fafc37268c9c542f3c033ce5f6a8aac45d9c5ae0f220c9c6963dcaa169b8e9810841fe7cdf3751e1505631d6
6
+ metadata.gz: d0c2dffb1b5b8366d2c37ae8addf1c15396825c3711acdf6c4b20b7818ddf9dc7ad720a0be1baad0cc8dbe29a88fb3e4fe681989d892b96f4390d8787e8a95de
7
+ data.tar.gz: c1cdf88c0f8ecad8d5b00fb5a1898445e33b2da407c77893f87df2d1ca57cf051d99642f65273fdf3e8c08ea71746dd8e3c013550d65324105f16e9cbbcfb375
data/README.md CHANGED
@@ -11,4 +11,4 @@ Azeroth
11
11
 
12
12
  Yard Documentation
13
13
  -------------------
14
- [https://www.rubydoc.info/gems/azeroth/0.4.0](https://www.rubydoc.info/gems/azeroth/0.4.0)
14
+ [https://www.rubydoc.info/gems/azeroth/0.4.0](https://www.rubydoc.info/gems/azeroth/0.5.0)
@@ -15,7 +15,8 @@ rules:
15
15
  exclude: []
16
16
  ExampleTag:
17
17
  enabled: true
18
- exclude: []
18
+ exclude:
19
+ - Azeroth::DummyDecorator#as_json
19
20
  ReturnTag:
20
21
  enabled: true
21
22
  exclude: []
@@ -24,6 +25,7 @@ rules:
24
25
  exclude:
25
26
  - Azeroth::Decorator#initialize
26
27
  - Azeroth::Decorator::HashBuilder#initialize
28
+ - Azeroth::DummyDecorator#initialize
27
29
  - Azeroth::Exception::InvalidOptions#initialize
28
30
  - Azeroth::Model#initialize
29
31
  - Azeroth::Options#initialize
@@ -10,12 +10,13 @@ require 'sinclair'
10
10
  #
11
11
  # @see Resourceable
12
12
  module Azeroth
13
- autoload :Decorator, 'azeroth/decorator'
14
- autoload :Exception, 'azeroth/exception'
15
- autoload :Model, 'azeroth/model'
16
- autoload :RequestHandler, 'azeroth/request_handler'
17
- autoload :Resourceable, 'azeroth/resourceable'
18
- autoload :ResourceBuilder, 'azeroth/resource_builder'
19
- autoload :RoutesBuilder, 'azeroth/routes_builder'
20
- autoload :Options, 'azeroth/options'
13
+ autoload :Decorator, 'azeroth/decorator'
14
+ autoload :DummyDecorator, 'azeroth/dummy_decorator'
15
+ autoload :Exception, 'azeroth/exception'
16
+ autoload :Model, 'azeroth/model'
17
+ autoload :RequestHandler, 'azeroth/request_handler'
18
+ autoload :Resourceable, 'azeroth/resourceable'
19
+ autoload :ResourceBuilder, 'azeroth/resource_builder'
20
+ autoload :RoutesBuilder, 'azeroth/routes_builder'
21
+ autoload :Options, 'azeroth/options'
21
22
  end
@@ -47,13 +47,27 @@ module Azeroth
47
47
  #
48
48
  # All attributes exposed
49
49
  #
50
- # @return [Array<Symbol>]
50
+ # @return [Hash<Symbol,Hash>]
51
51
  def attributes_map
52
- @attributes_map ||= {}
52
+ @attributes_map ||= build_attributes_map
53
53
  end
54
54
 
55
55
  private
56
56
 
57
+ # @api private
58
+ # @private
59
+ #
60
+ # Initialize attributes to be exposed map
61
+ #
62
+ # When the class inherity from another
63
+ # decorator, the new class should expose the
64
+ # same attributes.
65
+ #
66
+ # @return [Hash<Symbol,Hash>]
67
+ def build_attributes_map
68
+ superclass.try(:attributes_map).dup || {}
69
+ end
70
+
57
71
  # @visibility public
58
72
  # @api public
59
73
  # @private
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'sinclair'
4
+
5
+ module Azeroth
6
+ # @api private
7
+ # @author Darthjee
8
+ #
9
+ # Decorator that calls #as_json on object
10
+ class DummyDecorator
11
+ delegate :as_json, to: :@object
12
+ # @method as_json
13
+ # @public
14
+ # @api public
15
+ #
16
+ # Returns object.as_json
17
+ #
18
+ # @return [Hash]
19
+
20
+ # @param object [Object] object to be decorated
21
+ def initialize(object)
22
+ @object = object
23
+ end
24
+ end
25
+ end
@@ -7,12 +7,15 @@ module Azeroth
7
7
  # Model responsible for making the conection to the resource model class
8
8
  class Model
9
9
  # @param name [String,Symbol] name of the resource
10
- def initialize(name)
10
+ # @param options [Azeroth::Options] resource options
11
+ def initialize(name, options)
11
12
  if name.is_a?(Class)
12
13
  @klass = name
13
14
  else
14
15
  @name = name.to_s
15
16
  end
17
+
18
+ @options = options
16
19
  end
17
20
 
18
21
  # Returns the name of the resource represented by the model
@@ -46,19 +49,47 @@ module Azeroth
46
49
  # @return [Hash]
47
50
  def decorate(object)
48
51
  decorator_class.new(object).as_json
49
- rescue NameError
50
- object.as_json
51
52
  end
52
53
 
53
54
  private
54
55
 
56
+ attr_reader :options
57
+ # @method options
58
+ # @api private
59
+ # @private
60
+ #
61
+ # Returns options
62
+ #
63
+ # @return [Azeroth::Options]
64
+
55
65
  # @private
56
66
  #
57
67
  # Returns decorator class for the object
58
68
  #
59
69
  # @return [Class] subclass of {Decorator}
60
70
  def decorator_class
61
- @decorator_class ||= klass::Decorator
71
+ @decorator_class ||= calculate_decorator_class
72
+ end
73
+
74
+ # @private
75
+ #
76
+ # Calculates decorator class
77
+ #
78
+ # When options.decorator is false return DummyDecorator
79
+ #
80
+ # when options.decorator is a class, returns it
81
+ #
82
+ # When finding the decorator from the model fails,
83
+ # returns DummyDecorator
84
+ #
85
+ # @return [Azeroth::Decorator,DummyDecorator]
86
+ def calculate_decorator_class
87
+ return DummyDecorator unless options.decorator
88
+ return options.decorator if options.decorator.is_a?(Class)
89
+
90
+ klass::Decorator
91
+ rescue NameError
92
+ DummyDecorator
62
93
  end
63
94
  end
64
95
  end
@@ -6,16 +6,20 @@ module Azeroth
6
6
  #
7
7
  # Resource buiilding options
8
8
  class Options < ::OpenStruct
9
+ # Default options
9
10
  DEFAULT_OPTIONS = {
10
11
  only: %i[create destroy edit index new show update],
11
- except: []
12
+ except: [],
13
+ decorator: true
12
14
  }.freeze
13
15
 
14
- # @param options [Hash] hash with options
16
+ # @param options [Hash] hash with options (see {Options::DEFAULT_OPTIONS})
15
17
  # @option options only [Array<Symbol,String>] List of
16
18
  # actions to be built
17
19
  # @option options except [Array<Symbol,String>] List of
18
20
  # actions to not to be built
21
+ # @option options decorator [Azeroth::Decorator,TrueClass,FalseClass]
22
+ # Decorator class or flag allowing/disallowing decorators
19
23
  def initialize(options = {})
20
24
  check_options(options)
21
25
 
@@ -19,8 +19,8 @@ module Azeroth
19
19
  # @param options [Options]
20
20
  def initialize(clazz, model_name, options)
21
21
  @clazz = clazz
22
- @model = Azeroth::Model.new(model_name)
23
22
  @options = options
23
+ @model = Azeroth::Model.new(model_name, options)
24
24
 
25
25
  add_params
26
26
  add_resource
@@ -10,15 +10,25 @@ module Azeroth
10
10
  # Adds resource methods for resource
11
11
  #
12
12
  # @param name [String, Symbol] Name of the resource
13
- # @param options [Hash]
13
+ # @param (see Options#initialize)
14
+ # @option (see Options#initialize)
14
15
  #
15
- # @return [Array<MethodDefinition>]
16
+ # @return [Array<MethodDefinition>] list of methods created
16
17
  #
17
- # @example
18
+ # @see Options
19
+ #
20
+ # @example Controller without delete
21
+ # class DocumentsController < ApplicationController
22
+ # include Azeroth::Resourceable
23
+ #
24
+ # resource_for :document, except: :delete
25
+ # end
26
+ #
27
+ # @example Controller with only create, show and list
18
28
  # class DocumentsController < ApplicationController
19
29
  # include Azeroth::Resourceable
20
30
  #
21
- # resource_for :document
31
+ # resource_for :document, only: %w[create index show]
22
32
  # end
23
33
  def resource_for(name, **options)
24
34
  Builder.new(
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Azeroth
4
- VERSION = '0.4.0'
4
+ VERSION = '0.5.0'
5
5
  end
@@ -215,12 +215,12 @@ describe DocumentsController do
215
215
  end
216
216
 
217
217
  it do
218
- post :create, params: parameters
218
+ post :update, params: parameters
219
219
  expect(response).not_to be_successful
220
220
  end
221
221
 
222
222
  it 'returns created document json' do
223
- post :create, params: parameters
223
+ post :update, params: parameters
224
224
  expect(parsed_response).to eq(expected_json)
225
225
  end
226
226
 
@@ -0,0 +1,183 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe DocumentsWithErrorController do
6
+ let(:parsed_response) do
7
+ JSON.parse(response.body)
8
+ end
9
+
10
+ describe 'GET index' do
11
+ let(:documents_count) { 0 }
12
+
13
+ before do
14
+ documents_count.times.map { create(:document) }
15
+ end
16
+
17
+ context 'when calling on format json' do
18
+ it do
19
+ expect { get :index, params: { format: :json } }
20
+ .to raise_error(AbstractController::ActionNotFound)
21
+ end
22
+
23
+ context 'when there is a document' do
24
+ let(:documents_count) { 1 }
25
+
26
+ it do
27
+ expect { get :index, params: { format: :json } }
28
+ .to raise_error(AbstractController::ActionNotFound)
29
+ end
30
+ end
31
+ end
32
+
33
+ context 'when calling on format html' do
34
+ it do
35
+ expect { get :index, params: { format: :html } }
36
+ .to raise_error(AbstractController::ActionNotFound)
37
+ end
38
+ end
39
+ end
40
+
41
+ describe 'POST create' do
42
+ let(:payload) do
43
+ {
44
+ name: 'My document'
45
+ }
46
+ end
47
+ let(:parameters) do
48
+ {
49
+ format: format,
50
+ document: payload
51
+ }
52
+ end
53
+
54
+ context 'when requesting format json' do
55
+ let(:format) { :json }
56
+
57
+ let(:expected_json) do
58
+ Document::Decorator.new(Document.last).as_json
59
+ end
60
+
61
+ it do
62
+ post :create, params: parameters
63
+ expect(response).to be_successful
64
+ end
65
+
66
+ it 'returns created document json' do
67
+ post :create, params: parameters
68
+ expect(parsed_response).to eq(expected_json)
69
+ end
70
+
71
+ it do
72
+ expect { post :create, params: parameters }
73
+ .to change(Document, :count).by(1)
74
+ end
75
+ end
76
+
77
+ context 'when there is validation error' do
78
+ let(:format) { :json }
79
+ let(:payload) { { reference: 'x01' } }
80
+
81
+ let(:expected_body) do
82
+ Document::DecoratorWithError.new(Document.new(payload)).to_json
83
+ end
84
+
85
+ it do
86
+ post :create, params: parameters
87
+ expect(response).not_to be_successful
88
+ end
89
+
90
+ it 'returns created document json' do
91
+ post :create, params: parameters
92
+ expect(response.body).to eq(expected_body)
93
+ end
94
+
95
+ it do
96
+ expect { post :create, params: parameters }
97
+ .not_to change(Document, :count)
98
+ end
99
+ end
100
+ end
101
+
102
+ describe 'PATCH update' do
103
+ let(:document) { create(:document) }
104
+ let(:document_id) { document.id }
105
+
106
+ let(:expected_body) do
107
+ Document.last.to_json
108
+ end
109
+
110
+ let(:payload) do
111
+ {
112
+ name: 'My document'
113
+ }
114
+ end
115
+
116
+ let(:parameters) do
117
+ {
118
+ id: document_id,
119
+ format: :json,
120
+ document: payload
121
+ }
122
+ end
123
+
124
+ it do
125
+ patch :update, params: parameters
126
+ expect(response).to be_successful
127
+ end
128
+
129
+ it 'returns updated document json' do
130
+ patch :update, params: parameters
131
+ expect(response.body).to eq(expected_body)
132
+ end
133
+
134
+ it do
135
+ expect { patch :update, params: parameters }
136
+ .to change { document.reload.name }
137
+ .to('My document')
138
+ end
139
+
140
+ context 'when calling on an inexistent id' do
141
+ let(:document_id) { :wrong_id }
142
+
143
+ before do
144
+ patch :update, params: parameters
145
+ end
146
+
147
+ it { expect(response).not_to be_successful }
148
+ it { expect(response.status).to eq(404) }
149
+
150
+ it 'returns empty body' do
151
+ expect(response.body).to eq('')
152
+ end
153
+ end
154
+
155
+ context 'when there is validation error' do
156
+ let(:format) { :json }
157
+ let(:payload) { { name: nil } }
158
+
159
+ let(:expected_json) do
160
+ {
161
+ 'id' => document.id,
162
+ 'name' => '',
163
+ 'reference' => nil
164
+ }
165
+ end
166
+
167
+ it do
168
+ post :update, params: parameters
169
+ expect(response).not_to be_successful
170
+ end
171
+
172
+ it 'returns created document json' do
173
+ post :update, params: parameters
174
+ expect(parsed_response).to eq(expected_json)
175
+ end
176
+
177
+ it 'does not update entry' do
178
+ expect { post :update, params: parameters }
179
+ .not_to(change { document.reload.name })
180
+ end
181
+ end
182
+ end
183
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ class DocumentsWithErrorController < ApplicationController
4
+ include Azeroth::Resourceable
5
+
6
+ resource_for :document,
7
+ only: :create,
8
+ decorator: Document::DecoratorWithError
9
+
10
+ resource_for :document,
11
+ only: :update,
12
+ decorator: false
13
+ end
@@ -3,5 +3,5 @@
3
3
  class IndexDocumentsController < ApplicationController
4
4
  include Azeroth::Resourceable
5
5
 
6
- resource_for :document, only: :index
6
+ resource_for :document, only: 'index'
7
7
  end
@@ -1,8 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Document
4
- class DecoratorWithError < Azeroth::Decorator
5
- expose :name
4
+ class DecoratorWithError < Document::Decorator
6
5
  expose :errors, if: :invalid?
7
6
 
8
7
  def errors
@@ -4,7 +4,7 @@ class DummyModel
4
4
  include ActiveModel::Model
5
5
 
6
6
  attr_accessor :id, :first_name, :last_name, :age,
7
- :favorite_pokemon
7
+ :favorite_pokemon, :favorite_game
8
8
 
9
9
  validates_presence_of :first_name
10
10
 
@@ -3,4 +3,5 @@
3
3
  Rails.application.routes.draw do
4
4
  resources :documents
5
5
  resources :public_documents, controller: :index_documents
6
+ resources :create_documents, controller: :documents_with_error
6
7
  end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Azeroth::DummyDecorator do
6
+ subject(:decorator) { described_class.new(object) }
7
+
8
+ let(:model) { build(:dummy_model) }
9
+ let(:object) { model }
10
+
11
+ describe '#as_json' do
12
+ context 'when object is just a model' do
13
+ let(:expected_json) do
14
+ {
15
+ favorite_game: 'pokemon',
16
+ favorite_pokemon: 'squirtle',
17
+ first_name: 'dummy',
18
+ id: model.id,
19
+ last_name: 'bot',
20
+ age: 21
21
+ }.stringify_keys
22
+ end
23
+
24
+ it 'object.as_json' do
25
+ expect(decorator.as_json).to eq(expected_json)
26
+ end
27
+ end
28
+
29
+ context 'when object is an array' do
30
+ let(:object) { [model, other_model] }
31
+
32
+ let(:other_model) do
33
+ build(
34
+ :dummy_model,
35
+ first_name: 'dum',
36
+ age: 65,
37
+ favorite_pokemon: :bulbasaur
38
+ )
39
+ end
40
+
41
+ let(:expected_json) do
42
+ [
43
+ {
44
+ favorite_game: 'pokemon',
45
+ favorite_pokemon: 'squirtle',
46
+ first_name: 'dummy',
47
+ id: model.id,
48
+ last_name: 'bot',
49
+ age: 21
50
+ }, {
51
+ favorite_game: 'pokemon',
52
+ favorite_pokemon: 'bulbasaur',
53
+ first_name: 'dum',
54
+ id: other_model.id,
55
+ last_name: 'bot',
56
+ age: 65
57
+ }
58
+ ].map(&:stringify_keys)
59
+ end
60
+
61
+ it 'object.as_json' do
62
+ expect(decorator.as_json).to eq(expected_json)
63
+ end
64
+ end
65
+ end
66
+ end
@@ -23,7 +23,10 @@ shared_examples 'a model wrapper' do
23
23
  end
24
24
 
25
25
  describe Azeroth::Model do
26
- subject(:model) { described_class.new(input) }
26
+ subject(:model) { described_class.new(input, options) }
27
+
28
+ let(:options) { Azeroth::Options.new(options_hash) }
29
+ let(:options_hash) { {} }
27
30
 
28
31
  context 'when initializing with symbol' do
29
32
  let(:input) { :document }
@@ -119,5 +122,48 @@ describe Azeroth::Model do
119
122
  expect(model.decorate(object)).to eq(object.as_json)
120
123
  end
121
124
  end
125
+
126
+ context 'when model has a decorator and option decorator is false' do
127
+ let(:input) { :document }
128
+ let(:reference) { SecureRandom.uuid }
129
+ let(:object) { create(:document, reference: reference) }
130
+ let(:options_hash) { { decorator: false } }
131
+
132
+ context 'when object is just a model and has decorator' do
133
+ let!(:object) { create(:document, reference: reference) }
134
+
135
+ let(:expected_json) do
136
+ object.as_json
137
+ end
138
+
139
+ it 'object.as_json' do
140
+ expect(model.decorate(object)).to eq(expected_json)
141
+ end
142
+ end
143
+ end
144
+
145
+ context 'when model has a decorator and option decorator is a decorator' do
146
+ let(:input) { :document }
147
+ let(:reference) { SecureRandom.uuid }
148
+ let(:object) { create(:document, reference: reference) }
149
+ let(:options_hash) { { decorator: Document::DecoratorWithError } }
150
+
151
+ context 'when object is just a model and has decorator' do
152
+ let!(:object) { Document.new }
153
+
154
+ let(:expected_json) do
155
+ {
156
+ name: nil,
157
+ errors: {
158
+ name: ["can't be blank"]
159
+ }
160
+ }.stringify_keys
161
+ end
162
+
163
+ it 'object.as_json' do
164
+ expect(model.decorate(object)).to eq(expected_json)
165
+ end
166
+ end
167
+ end
122
168
  end
123
169
  end
@@ -8,7 +8,8 @@ describe Azeroth::RequestHandler do
8
8
 
9
9
  let(:controller) { controller_class.new }
10
10
  let(:params) { ActionController::Parameters.new(parameters) }
11
- let(:model) { Azeroth::Model.new(:document) }
11
+ let(:model) { Azeroth::Model.new(:document, options) }
12
+ let(:options) { Azeroth::Options.new }
12
13
 
13
14
  let(:decorator) { Document::Decorator.new(Document.all) }
14
15
  let(:expected_json) { decorator.as_json }
@@ -5,7 +5,8 @@ require 'spec_helper'
5
5
  describe Azeroth::ResourceBuilder do
6
6
  subject(:resource_builder) { described_class.new(model, builder) }
7
7
 
8
- let(:model) { Azeroth::Model.new(:document) }
8
+ let(:model) { Azeroth::Model.new(:document, options) }
9
+ let(:options) { Azeroth::Options.new }
9
10
  let(:builder) { Sinclair.new(klass) }
10
11
  let(:klass) { Class.new(ResourceBuilderController) }
11
12
 
@@ -9,7 +9,7 @@ describe Azeroth::RoutesBuilder do
9
9
 
10
10
  let(:controller) { controller_class.new }
11
11
  let(:params) { ActionController::Parameters.new(parameters) }
12
- let(:model) { Azeroth::Model.new(:document) }
12
+ let(:model) { Azeroth::Model.new(:document, options) }
13
13
  let(:builder) { Sinclair.new(controller_class) }
14
14
  let(:parameters) { { action: :index, format: :json } }
15
15
 
@@ -7,5 +7,6 @@ FactoryBot.define do
7
7
  last_name { 'bot' }
8
8
  age { 21 }
9
9
  favorite_pokemon { 'squirtle' }
10
+ favorite_game { 'pokemon' }
10
11
  end
11
12
  end
@@ -5,7 +5,8 @@ shared_examples 'a request handler' do |status: :ok|
5
5
 
6
6
  let(:controller) { controller_class.new }
7
7
  let(:params) { ActionController::Parameters.new(parameters) }
8
- let(:model) { Azeroth::Model.new(:document) }
8
+ let(:model) { Azeroth::Model.new(:document, options) }
9
+ let(:options) { Azeroth::Options.new }
9
10
  let(:extra_params) { {} }
10
11
 
11
12
  let(:decorator) { Document::Decorator.new(expected_resource) }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: azeroth
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Darthjee
@@ -416,6 +416,7 @@ files:
416
416
  - lib/azeroth.rb
417
417
  - lib/azeroth/decorator.rb
418
418
  - lib/azeroth/decorator/hash_builder.rb
419
+ - lib/azeroth/dummy_decorator.rb
419
420
  - lib/azeroth/exception.rb
420
421
  - lib/azeroth/model.rb
421
422
  - lib/azeroth/options.rb
@@ -434,6 +435,7 @@ files:
434
435
  - lib/azeroth/routes_builder.rb
435
436
  - lib/azeroth/version.rb
436
437
  - spec/controllers/documents_controller_spec.rb
438
+ - spec/controllers/documents_with_error_controller_spec.rb
437
439
  - spec/controllers/index_documents_controller_spec.rb
438
440
  - spec/dummy/.ruby-version
439
441
  - spec/dummy/Rakefile
@@ -448,6 +450,7 @@ files:
448
450
  - spec/dummy/app/controllers/application_controller.rb
449
451
  - spec/dummy/app/controllers/concerns/.keep
450
452
  - spec/dummy/app/controllers/documents_controller.rb
453
+ - spec/dummy/app/controllers/documents_with_error_controller.rb
451
454
  - spec/dummy/app/controllers/index_documents_controller.rb
452
455
  - spec/dummy/app/helpers/application_helper.rb
453
456
  - spec/dummy/app/jobs/application_job.rb
@@ -513,6 +516,7 @@ files:
513
516
  - spec/integration/yard/azeroth/exception/invalid_options_spec.rb
514
517
  - spec/lib/azeroth/decorator/hash_builder_spec.rb
515
518
  - spec/lib/azeroth/decorator_spec.rb
519
+ - spec/lib/azeroth/dummy_decorator_spec.rb
516
520
  - spec/lib/azeroth/exception/invalid_options_spec.rb
517
521
  - spec/lib/azeroth/model_spec.rb
518
522
  - spec/lib/azeroth/options_spec.rb
@@ -563,6 +567,7 @@ specification_version: 4
563
567
  summary: Azeroth
564
568
  test_files:
565
569
  - spec/controllers/documents_controller_spec.rb
570
+ - spec/controllers/documents_with_error_controller_spec.rb
566
571
  - spec/controllers/index_documents_controller_spec.rb
567
572
  - spec/dummy/.ruby-version
568
573
  - spec/dummy/Rakefile
@@ -577,6 +582,7 @@ test_files:
577
582
  - spec/dummy/app/controllers/application_controller.rb
578
583
  - spec/dummy/app/controllers/concerns/.keep
579
584
  - spec/dummy/app/controllers/documents_controller.rb
585
+ - spec/dummy/app/controllers/documents_with_error_controller.rb
580
586
  - spec/dummy/app/controllers/index_documents_controller.rb
581
587
  - spec/dummy/app/helpers/application_helper.rb
582
588
  - spec/dummy/app/jobs/application_job.rb
@@ -642,6 +648,7 @@ test_files:
642
648
  - spec/integration/yard/azeroth/exception/invalid_options_spec.rb
643
649
  - spec/lib/azeroth/decorator/hash_builder_spec.rb
644
650
  - spec/lib/azeroth/decorator_spec.rb
651
+ - spec/lib/azeroth/dummy_decorator_spec.rb
645
652
  - spec/lib/azeroth/exception/invalid_options_spec.rb
646
653
  - spec/lib/azeroth/model_spec.rb
647
654
  - spec/lib/azeroth/options_spec.rb