azeroth 0.4.0 → 0.5.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
  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