azeroth 0.8.0 → 0.9.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: '09152b8053d40bd19405c5b7165458483d4304310fa5ec64c0d2b5723dda0067'
4
- data.tar.gz: 1a1039542352929720e5cc7ae1242932b7d2a65856e2156b14a36d1a8bb1722b
3
+ metadata.gz: fef3f6d11872a3a25c77900028239d743c809aa1aae8d59526df351a1c47e97c
4
+ data.tar.gz: ae58f2737c72e939067a86061dbc3ab20f1da0ef0d27615c753aacbebb0591d1
5
5
  SHA512:
6
- metadata.gz: 2ae5257e2851ccbbadbd79d9a0c0a13be63e392b2af16c6e1f66be399ee00bc51b06f9682f25d88648f3a32d2c07451d456d80035f04b48a4cc471d27a572e59
7
- data.tar.gz: d7c01b81ce09615d65cc451d2a1669ac9d843d18d75fbb0c12c2e4356507fce62288145bd30295674619a0649327b1b69568fede8adb452e602073f67659235e
6
+ metadata.gz: ed3b96c2b672b737239713899bfb8ef5546dd1e66d28327fb3a7a66540eede50e93f5e73a3890dcea0474eda4f4bceaaa6804da47a1ea174606430eac14afe93
7
+ data.tar.gz: ce7d30afc6594731f31aa0591c6747dd110db2f485557d51fffd14cb4f7199e1ab4ebbfb748109dc42da72bda1764de48bd25821461f1ddf15fc49c607a971be
data/.circleci/config.yml CHANGED
@@ -7,8 +7,12 @@ workflows:
7
7
  filters:
8
8
  tags:
9
9
  only: /.*/
10
+ - checks:
11
+ filters:
12
+ tags:
13
+ only: /.*/
10
14
  - build-and-release:
11
- requires: [test]
15
+ requires: [test, checks]
12
16
  filters:
13
17
  tags:
14
18
  only: /\d+\.\d+\.\d+/
@@ -18,7 +22,7 @@ workflows:
18
22
  jobs:
19
23
  test:
20
24
  docker:
21
- - image: darthjee/circleci_rails_gems:0.6.3
25
+ - image: darthjee/circleci_rails_gems:0.8.0
22
26
  environment:
23
27
  PROJECT: azeroth
24
28
  steps:
@@ -32,12 +36,22 @@ jobs:
32
36
  - run:
33
37
  name: RSpec
34
38
  command: bundle exec rspec
35
- - run:
36
- name: Rubocop
37
- command: rubocop
38
39
  - run:
39
40
  name: Coverage Test Report
40
41
  command: cc-test-reporter after-build --exit-code $?
42
+ checks:
43
+ docker:
44
+ - image: darthjee/circleci_rails_gems:0.8.0
45
+ environment:
46
+ PROJECT: azeroth
47
+ steps:
48
+ - checkout
49
+ - run:
50
+ name: Bundle Install
51
+ command: bundle install
52
+ - run:
53
+ name: Rubocop
54
+ command: rubocop
41
55
  - run:
42
56
  name: Yardstick coverage check
43
57
  command: bundle exec rake verify_measurements
@@ -52,7 +66,7 @@ jobs:
52
66
  command: check_specs
53
67
  build-and-release:
54
68
  docker:
55
- - image: darthjee/circleci_rails_gems:0.6.3
69
+ - image: darthjee/circleci_rails_gems:0.8.0
56
70
  environment:
57
71
  PROJECT: azeroth
58
72
  steps:
data/Dockerfile CHANGED
@@ -1,4 +1,4 @@
1
- FROM darthjee/rails_gems:0.7.0 as base
1
+ FROM darthjee/rails_gems:0.8.0 as base
2
2
  FROM darthjee/scripts:0.1.8 as scripts
3
3
 
4
4
  ######################################
data/README.md CHANGED
@@ -11,7 +11,7 @@ Azeroth
11
11
 
12
12
  Yard Documentation
13
13
  -------------------
14
- [https://www.rubydoc.info/gems/azeroth/0.8.0](https://www.rubydoc.info/gems/azeroth/0.8.0)
14
+ [https://www.rubydoc.info/gems/azeroth/0.9.0](https://www.rubydoc.info/gems/azeroth/0.9.0)
15
15
 
16
16
  Azeroth has been designed making the coding of controllers easier
17
17
  as routes in controllers are usually copy, paste and replace of same
@@ -61,6 +61,7 @@ It accepts options
61
61
  - before_save: Method/Proc to be ran before saving the resource on create or update
62
62
  - after_save: Method/Proc to be ran after saving the resource on create or update
63
63
  - build_with: Method/Block to be ran when building the reource on create
64
+ - update_with: Method/Block to be ran when updating the reource on update
64
65
  - paginated: Flag when pagination should be applied
65
66
  - per_page: Number of items returned when pagination is active
66
67
 
data/azeroth.gemspec CHANGED
@@ -27,7 +27,7 @@ Gem::Specification.new do |gem|
27
27
  gem.add_development_dependency 'activerecord', '~> 5.2.x'
28
28
  gem.add_development_dependency 'bundler', '1.16.1'
29
29
  gem.add_development_dependency 'factory_bot', '5.2.0'
30
- gem.add_development_dependency 'nokogiri', '1.11.4'
30
+ gem.add_development_dependency 'nokogiri', '1.12.5'
31
31
  gem.add_development_dependency 'pry', '0.12.2'
32
32
  gem.add_development_dependency 'pry-nav', '0.3.0'
33
33
  gem.add_development_dependency 'rails', '~> 5.2.x'
data/config/yardstick.yml CHANGED
@@ -23,6 +23,7 @@ rules:
23
23
  Summary::Presence:
24
24
  enabled: true
25
25
  exclude:
26
+ - Azeroth::ControllerInterface#initialize
26
27
  - Azeroth::Decorator#initialize
27
28
  - Azeroth::Decorator::HashBuilder#initialize
28
29
  - Azeroth::Decorator::KeyValueExtractor#initialize
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Azeroth
4
+ # @api private
5
+ #
6
+ # Interface for using the controller
7
+ class ControllerInterface
8
+ # @param controller [ApplicationController]
9
+ def initialize(controller)
10
+ @controller = controller
11
+ end
12
+
13
+ # Set response headers
14
+ #
15
+ # @param headers_hash [Hash] headers to be set
16
+ #
17
+ # @return [Hash]
18
+ def add_headers(headers_hash)
19
+ controller.instance_eval do
20
+ headers_hash.each do |key, value|
21
+ headers[key.to_s] = value
22
+ end
23
+ end
24
+ end
25
+
26
+ # Renders response json
27
+ #
28
+ # @return [String]
29
+ def render_json(json, status)
30
+ controller.instance_eval do
31
+ render(json: json, status: status)
32
+ end
33
+ end
34
+
35
+ # Set a variable in the controller
36
+ #
37
+ # @param variable [String,Symbol] variable name
38
+ # @param value [Object] value to be set
39
+ #
40
+ # @return [Object]
41
+ def set(variable, value)
42
+ controller.instance_variable_set("@#{variable}", value)
43
+ end
44
+
45
+ # Forces a controller to run a block
46
+ #
47
+ # When the block is a +Proc+ that is evaluated,
48
+ # when it is a +Symbol+ or +String+, a method is called
49
+ #
50
+ # @return [Object] whatever the block returns
51
+ def run(block)
52
+ case block
53
+ when Proc
54
+ controller.instance_eval(&block)
55
+ else
56
+ controller.send(block)
57
+ end
58
+ end
59
+
60
+ private
61
+
62
+ attr_reader :controller
63
+ # @method controller
64
+ # @private
65
+ # @api private
66
+ #
67
+ # Controller where methods will be called
68
+ #
69
+ # @return [ApplicationController]
70
+
71
+ # @private
72
+ #
73
+ # Dispatcher to delegate all methods call to controller
74
+ #
75
+ # @param method_name [Symbol] name of the method
76
+ # called
77
+ # @param args [Array<Object>] arguments of the
78
+ # method called
79
+ #
80
+ # @return [Object]
81
+ def method_missing(method_name, *args)
82
+ if controller.respond_to?(method_name, true)
83
+ controller.send(method_name, *args)
84
+ else
85
+ super
86
+ end
87
+ end
88
+
89
+ # @private
90
+ #
91
+ # Checks if a controller responds to a method
92
+ #
93
+ # @param method_name [Symbol] name of the method checked
94
+ # @param include_private [TrueClass,FalseClass] flag
95
+ # indicating if private methods should be included
96
+ #
97
+ # @return [TrueClass,FalseClass]
98
+ def respond_to_missing?(method_name, include_private)
99
+ controller.respond_to?(method_name, include_private)
100
+ end
101
+ end
102
+ end
@@ -11,7 +11,7 @@ module Azeroth
11
11
  #
12
12
  # reaader delegate method calls to @object
13
13
  #
14
- # @return (see Sinclair#build)
14
+ # @return [Array<Sinclair::MethodDefinition>]
15
15
  def self.build_reader(klass, attribute)
16
16
  new(klass).build_reader(attribute)
17
17
  end
@@ -21,6 +21,7 @@ module Azeroth
21
21
  before_save: nil,
22
22
  after_save: nil,
23
23
  build_with: nil,
24
+ update_with: nil,
24
25
  paginated: false,
25
26
  per_page: 20
26
27
  }.freeze
@@ -110,6 +111,13 @@ module Azeroth
110
111
  #
111
112
  # @return [Symbol,Proc]
112
113
 
114
+ # @method update_with
115
+ # @api private
116
+ #
117
+ # Block or method name to be ran when updating the resource
118
+ #
119
+ # @return [Symbol,Proc]
120
+
113
121
  # @method paginated
114
122
  # @api private
115
123
  #
@@ -29,7 +29,7 @@ module Azeroth
29
29
  # @return [Object]
30
30
  def build_and_save_resource
31
31
  @resource = build_resource
32
- controller.instance_variable_set("@#{model.name}", resource)
32
+ controller.set(model.name, resource)
33
33
 
34
34
  trigger_event(:save) do
35
35
  resource.tap(&:save)
@@ -47,12 +47,7 @@ module Azeroth
47
47
  def build_resource
48
48
  return collection.build(attributes) unless build_with
49
49
 
50
- case build_with
51
- when Proc
52
- controller.instance_eval(&build_with)
53
- else
54
- controller.send(build_with)
55
- end
50
+ controller.run(build_with)
56
51
  end
57
52
 
58
53
  # @private
@@ -21,6 +21,21 @@ module Azeroth
21
21
  paginated_entries
22
22
  end
23
23
 
24
+ # @private
25
+ #
26
+ # returns pagination headers
27
+ #
28
+ # @return [Hash] heders
29
+ def headers
30
+ return {} unless paginated?
31
+
32
+ {
33
+ pages: pages,
34
+ page: current_page,
35
+ per_page: limit
36
+ }
37
+ end
38
+
24
39
  # @private
25
40
  #
26
41
  # paginated collection of the model
@@ -39,8 +54,7 @@ module Azeroth
39
54
  #
40
55
  # @return [Integer]
41
56
  def offset
42
- page = (params[:page] || 1).to_i - 1
43
- page * limit
57
+ (current_page - 1) * limit
44
58
  end
45
59
 
46
60
  # @private
@@ -62,6 +76,24 @@ module Azeroth
62
76
  def scoped_entries
63
77
  controller.send(model.plural)
64
78
  end
79
+
80
+ # @private
81
+ #
82
+ # calculates current page
83
+ #
84
+ # @return [Integer]
85
+ def current_page
86
+ (params[:page] || 1).to_i
87
+ end
88
+
89
+ # @private
90
+ #
91
+ # calculates how many pages are there
92
+ #
93
+ # @return [Integer]
94
+ def pages
95
+ (scoped_entries.count.to_f / limit).ceil
96
+ end
65
97
  end
66
98
  end
67
99
  end
@@ -8,6 +8,8 @@ module Azeroth
8
8
  class Update < RequestHandler
9
9
  private
10
10
 
11
+ delegate :update_with, to: :options
12
+
11
13
  # @private
12
14
  #
13
15
  # Updates and return an instance of the model
@@ -17,20 +19,33 @@ module Azeroth
17
19
  #
18
20
  # @return [Object]
19
21
  def resource
20
- @resource ||= update_resource
22
+ @resource ||= perform_update
21
23
  end
22
24
 
23
- # build resource for update
25
+ # Update a resource saving it to the database
24
26
  #
25
- # @return [Object]
26
- def update_resource
27
- controller.send(model.name).tap do |entry|
27
+ # @return [Object] updated resource
28
+ def perform_update
29
+ @resource = controller.send(model.name)
30
+ resource.tap do
28
31
  trigger_event(:save) do
29
- entry.update(attributes)
32
+ update_and_save_resource
30
33
  end
31
34
  end
32
35
  end
33
36
 
37
+ # @private
38
+ #
39
+ # Update the resource, either by running update_with
40
+ # or directly updating the attributes in the object
41
+ #
42
+ # @return [Object] updated resource
43
+ def update_and_save_resource
44
+ return resource.update(attributes) unless update_with
45
+
46
+ controller.run(update_with)
47
+ end
48
+
34
49
  # @private
35
50
  #
36
51
  # Response status
@@ -19,7 +19,7 @@ module Azeroth
19
19
  # @param controller [ApplicationController]
20
20
  # @param model [Azeroth::Model]
21
21
  def initialize(controller, model, options)
22
- @controller = controller
22
+ @controller = ControllerInterface.new(controller)
23
23
  @model = model
24
24
  @options = options
25
25
  end
@@ -35,12 +35,11 @@ module Azeroth
35
35
  def process
36
36
  return unless json?
37
37
 
38
- json = model.decorate(resource)
39
- response_status = status
40
-
41
- controller.instance_eval do
42
- render(json: json, status: response_status)
43
- end
38
+ controller.add_headers(headers)
39
+ controller.render_json(
40
+ model.decorate(resource),
41
+ status
42
+ )
44
43
  end
45
44
 
46
45
  private
@@ -141,5 +140,15 @@ module Azeroth
141
140
  def collection
142
141
  @collection = controller.send(model.plural)
143
142
  end
143
+
144
+ # @private
145
+ # @abstract
146
+ #
147
+ # Headers to be added
148
+ #
149
+ # @return [Hash]
150
+ def headers
151
+ {}
152
+ end
144
153
  end
145
154
  end
@@ -25,6 +25,7 @@ module Azeroth
25
25
  add_params
26
26
  add_resource
27
27
  add_routes
28
+ add_helpers
28
29
  end
29
30
 
30
31
  private
@@ -127,6 +128,14 @@ module Azeroth
127
128
  RoutesBuilder.new(model, builder, options).append
128
129
  end
129
130
 
131
+ # Add helpers to render objects on template
132
+ #
133
+ # @return [String]
134
+ def add_helpers
135
+ clazz.public_send(:helper_method, model.name)
136
+ clazz.public_send(:helper_method, model.plural)
137
+ end
138
+
130
139
  # Returns all updatable attributes
131
140
  #
132
141
  # @return [Array<String>]
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Azeroth
4
- VERSION = '0.8.0'
4
+ VERSION = '0.9.0'
5
5
  end
data/lib/azeroth.rb CHANGED
@@ -11,12 +11,13 @@ require 'jace'
11
11
  #
12
12
  # @see Resourceable
13
13
  module Azeroth
14
- autoload :Decorator, 'azeroth/decorator'
15
- autoload :DummyDecorator, 'azeroth/dummy_decorator'
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'
14
+ autoload :ControllerInterface, 'azeroth/controller_interface'
15
+ autoload :Decorator, 'azeroth/decorator'
16
+ autoload :DummyDecorator, 'azeroth/dummy_decorator'
17
+ autoload :Model, 'azeroth/model'
18
+ autoload :RequestHandler, 'azeroth/request_handler'
19
+ autoload :Resourceable, 'azeroth/resourceable'
20
+ autoload :ResourceBuilder, 'azeroth/resource_builder'
21
+ autoload :RoutesBuilder, 'azeroth/routes_builder'
22
+ autoload :Options, 'azeroth/options'
22
23
  end
@@ -38,6 +38,18 @@ describe PaginatedDocumentsController do
38
38
  it 'renders documents json' do
39
39
  expect(parsed_response).to eq(expected_json)
40
40
  end
41
+
42
+ it 'adds total pages header' do
43
+ expect(response.headers['pages']).to eq(1)
44
+ end
45
+
46
+ it 'adds current page header' do
47
+ expect(response.headers['page']).to eq(1)
48
+ end
49
+
50
+ it 'adds per page header' do
51
+ expect(response.headers['per_page']).to eq(20)
52
+ end
41
53
  end
42
54
 
43
55
  context 'when there are more documents than expected pagination' do
@@ -54,6 +66,18 @@ describe PaginatedDocumentsController do
54
66
  expect(parsed_response)
55
67
  .to have(20).elements
56
68
  end
69
+
70
+ it 'adds total pages header' do
71
+ expect(response.headers['pages']).to eq(2)
72
+ end
73
+
74
+ it 'adds current page header' do
75
+ expect(response.headers['page']).to eq(1)
76
+ end
77
+
78
+ it 'adds per page header' do
79
+ expect(response.headers['per_page']).to eq(20)
80
+ end
57
81
  end
58
82
 
59
83
  context 'when page is given' do
@@ -72,6 +96,18 @@ describe PaginatedDocumentsController do
72
96
  .to have(documents_count - 20)
73
97
  .elements
74
98
  end
99
+
100
+ it 'adds total pages header' do
101
+ expect(response.headers['pages']).to eq(2)
102
+ end
103
+
104
+ it 'adds current page header' do
105
+ expect(response.headers['page']).to eq(2)
106
+ end
107
+
108
+ it 'adds per page header' do
109
+ expect(response.headers['per_page']).to eq(20)
110
+ end
75
111
  end
76
112
 
77
113
  context 'when per_page is given' do
@@ -91,6 +127,19 @@ describe PaginatedDocumentsController do
91
127
  .to have(per_page)
92
128
  .elements
93
129
  end
130
+
131
+ it 'adds total pages header' do
132
+ expect(response.headers['pages'])
133
+ .to eq((documents_count.to_f / per_page).ceil)
134
+ end
135
+
136
+ it 'adds current page header' do
137
+ expect(response.headers['page']).to eq(1)
138
+ end
139
+
140
+ it 'adds per page header' do
141
+ expect(response.headers['per_page']).to eq(per_page)
142
+ end
94
143
  end
95
144
  end
96
145
  end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe RenderingController do
6
+ let(:parsed_response) do
7
+ JSON.parse(response.body)
8
+ end
9
+
10
+ describe 'GET index' do
11
+ render_views
12
+
13
+ let(:documents_count) { Random.rand(2..5) }
14
+
15
+ let(:expected_content) do
16
+ documents.map do |document|
17
+ "<li><strong>Name:</strong>#{document.name}</li>"
18
+ end.join("\n ")
19
+ end
20
+
21
+ let!(:documents) { create_list(:document, documents_count) }
22
+
23
+ context 'when calling on format html' do
24
+ before do
25
+ get :index, params: { format: :html }
26
+ end
27
+
28
+ it { expect(response).to be_successful }
29
+
30
+ it { expect(response).to render_template('rendering/index') }
31
+
32
+ it { expect(response.body).to include(expected_content) }
33
+ end
34
+ end
35
+
36
+ describe 'GET show' do
37
+ render_views
38
+
39
+ let(:document) { create(:document) }
40
+ let(:document_id) { document.id }
41
+ let(:expected_content) do
42
+ "<p><strong>Name:</strong>#{document.name}</p>"
43
+ end
44
+
45
+ context 'when calling on format html' do
46
+ before do
47
+ get :show, params: { id: document.id, format: :html }
48
+ end
49
+
50
+ it { expect(response).to be_successful }
51
+
52
+ it { expect(response).to render_template('rendering/show') }
53
+
54
+ it { expect(response.body).to include(expected_content) }
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class RenderingController < ApplicationController
4
+ include Azeroth::Resourceable
5
+
6
+ resource_for :document
7
+ end
@@ -0,0 +1,5 @@
1
+ <ul>
2
+ <% documents.each do |document| %>
3
+ <li><strong>Name:</strong><%= document.name %></li>
4
+ <% end %>
5
+ </ul>
@@ -0,0 +1 @@
1
+ <p><strong>Name:</strong><%= document.name %></p>
@@ -2,6 +2,7 @@
2
2
 
3
3
  Rails.application.routes.draw do
4
4
  resources :documents
5
+ resources :rendering
5
6
  resources :public_documents, controller: :index_documents
6
7
  resources :create_documents, controller: :documents_with_error
7
8
  resources :paginated_documents
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Azeroth::ControllerInterface do
6
+ subject(:interface) { described_class.new(controller) }
7
+
8
+ let(:controller) { controller_class.new }
9
+ let(:controller_class) { RequestHandlerController }
10
+
11
+ describe '#add_headers' do
12
+ let(:controller_headers) do
13
+ {
14
+ 'old_key': 100
15
+ }
16
+ end
17
+
18
+ let(:headers) do
19
+ {
20
+ key1: 10,
21
+ key2: 20
22
+ }
23
+ end
24
+
25
+ before do
26
+ allow(controller)
27
+ .to receive(:headers)
28
+ .and_return(controller_headers)
29
+ end
30
+
31
+ it 'sets controller headers' do
32
+ expect { interface.add_headers(headers) }
33
+ .to change { controller_headers }
34
+ .from(controller_headers)
35
+ .to(controller_headers.merge(headers.stringify_keys))
36
+ end
37
+ end
38
+
39
+ describe '#render_json' do
40
+ let(:json) { { key: 'value' } }
41
+ let(:status) { 200 }
42
+
43
+ before do
44
+ allow(controller)
45
+ .to receive(:render)
46
+ .with(json: json, status: status)
47
+ end
48
+
49
+ it 'renders json' do
50
+ interface.render_json(json, status)
51
+
52
+ expect(controller).to have_received(:render)
53
+ end
54
+ end
55
+
56
+ describe '#set' do
57
+ it 'sets instance variable' do
58
+ expect { interface.set(:name, 20) }
59
+ .to change { controller.instance_variable_get('@name') }
60
+ .from(nil)
61
+ .to(20)
62
+ end
63
+ end
64
+
65
+ describe 'method missing' do
66
+ before do
67
+ create(:document)
68
+ end
69
+
70
+ it 'delegates call to controller' do
71
+ expect(interface.documents)
72
+ .to eq(Document.all)
73
+ end
74
+
75
+ context 'when method is not defined' do
76
+ it do
77
+ expect { interface.pokemons }
78
+ .to raise_error(NoMethodError)
79
+ end
80
+ end
81
+ end
82
+ end
@@ -14,6 +14,21 @@ describe Azeroth::RequestHandler::Index do
14
14
  let(:documents_count) { Random.rand(21..30) }
15
15
  let(:expected_resource) { Document.all.limit(20) }
16
16
  let(:options_hash) { { paginated: true } }
17
+
18
+ it 'adds total pages header' do
19
+ handler.process
20
+ expect(controller_headers['pages']).to eq(2)
21
+ end
22
+
23
+ it 'adds current page header' do
24
+ handler.process
25
+ expect(controller_headers['page']).to eq(1)
26
+ end
27
+
28
+ it 'adds per page header' do
29
+ handler.process
30
+ expect(controller_headers['per_page']).to eq(20)
31
+ end
17
32
  end
18
33
 
19
34
  context 'when page is given' do
@@ -22,6 +37,21 @@ describe Azeroth::RequestHandler::Index do
22
37
  let(:expected_resource) { Document.all.offset(20).limit(20) }
23
38
  let(:options_hash) { { paginated: true } }
24
39
  let(:extra_params) { { page: '2' } }
40
+
41
+ it 'adds total pages header' do
42
+ handler.process
43
+ expect(controller_headers['pages']).to eq(3)
44
+ end
45
+
46
+ it 'adds current page header' do
47
+ handler.process
48
+ expect(controller_headers['page']).to eq(2)
49
+ end
50
+
51
+ it 'adds per page header' do
52
+ handler.process
53
+ expect(controller_headers['per_page']).to eq(20)
54
+ end
25
55
  end
26
56
  end
27
57
 
@@ -31,6 +61,21 @@ describe Azeroth::RequestHandler::Index do
31
61
  let(:expected_resource) { Document.all.offset(40) }
32
62
  let(:options_hash) { { paginated: true } }
33
63
  let(:extra_params) { { page: '3' } }
64
+
65
+ it 'adds total pages header' do
66
+ handler.process
67
+ expect(controller_headers['pages']).to eq(3)
68
+ end
69
+
70
+ it 'adds current page header' do
71
+ handler.process
72
+ expect(controller_headers['page']).to eq(3)
73
+ end
74
+
75
+ it 'adds per page header' do
76
+ handler.process
77
+ expect(controller_headers['per_page']).to eq(20)
78
+ end
34
79
  end
35
80
  end
36
81
 
@@ -39,15 +84,45 @@ describe Azeroth::RequestHandler::Index do
39
84
  let(:documents_count) { Random.rand(21..30) }
40
85
  let(:expected_resource) { Document.all.limit(10) }
41
86
  let(:options_hash) { { paginated: true, per_page: 10 } }
87
+
88
+ it 'adds total pages header' do
89
+ handler.process
90
+ expect(controller_headers['pages']).to eq(3)
91
+ end
92
+
93
+ it 'adds current page header' do
94
+ handler.process
95
+ expect(controller_headers['page']).to eq(1)
96
+ end
97
+
98
+ it 'adds per page header' do
99
+ handler.process
100
+ expect(controller_headers['per_page']).to eq(10)
101
+ end
42
102
  end
43
103
  end
44
104
 
45
105
  context 'when per page is given in params' do
46
106
  it_behaves_like 'a request handler' do
47
107
  let(:documents_count) { Random.rand(41..50) }
48
- let(:expected_resource) { Document.all.offset(15).limit(15) }
49
- let(:options_hash) { { paginated: true, per_page: 10 } }
50
- let(:extra_params) { { page: '2', per_page: '15' } }
108
+ let(:expected_resource) { Document.all.offset(10).limit(10) }
109
+ let(:options_hash) { { paginated: true, per_page: 15 } }
110
+ let(:extra_params) { { page: '2', per_page: '10' } }
111
+
112
+ it 'adds total pages header' do
113
+ handler.process
114
+ expect(controller_headers['pages']).to eq(5)
115
+ end
116
+
117
+ it 'adds current page header' do
118
+ handler.process
119
+ expect(controller_headers['page']).to eq(2)
120
+ end
121
+
122
+ it 'adds per page header' do
123
+ handler.process
124
+ expect(controller_headers['per_page']).to eq(10)
125
+ end
51
126
  end
52
127
  end
53
128
  end
@@ -30,6 +30,118 @@ describe Azeroth::RequestHandler::Update do
30
30
  end
31
31
  end
32
32
 
33
+ context 'when update_with option is given ' do
34
+ context 'with block' do
35
+ it_behaves_like 'a request handler' do
36
+ let(:block) do
37
+ proc do
38
+ document.assign_attributes(document_params)
39
+ document.name = "#{document.name}!"
40
+ document.save
41
+ end
42
+ end
43
+
44
+ let(:options_hash) do
45
+ {
46
+ update_with: block
47
+ }
48
+ end
49
+
50
+ let(:expected_resource) { document }
51
+
52
+ let(:extra_params) do
53
+ {
54
+ id: document.id,
55
+ document: {
56
+ name: 'New Name'
57
+ }
58
+ }
59
+ end
60
+
61
+ let(:expected_json) do
62
+ {
63
+ 'name' => 'New Name!'
64
+ }
65
+ end
66
+
67
+ it 'updates the values given by request' do
68
+ expect { handler.process }
69
+ .to change { document.reload.name }
70
+ .from(document.name)
71
+ .to('New Name!')
72
+ end
73
+ end
74
+ end
75
+
76
+ context 'with symbol' do
77
+ it_behaves_like 'a request handler' do
78
+ let(:options_hash) do
79
+ {
80
+ update_with: :add_bang_name
81
+ }
82
+ end
83
+
84
+ let(:expected_resource) { document }
85
+
86
+ let(:extra_params) do
87
+ {
88
+ id: document.id,
89
+ document: {
90
+ name: 'New Name'
91
+ }
92
+ }
93
+ end
94
+
95
+ let(:expected_json) do
96
+ {
97
+ 'name' => 'New Name!'
98
+ }
99
+ end
100
+
101
+ it 'updates the values given by request' do
102
+ expect { handler.process }
103
+ .to change { document.reload.name }
104
+ .from(document.name)
105
+ .to('New Name!')
106
+ end
107
+ end
108
+ end
109
+
110
+ context 'with string' do
111
+ it_behaves_like 'a request handler' do
112
+ let(:options_hash) do
113
+ {
114
+ update_with: 'add_bang_name'
115
+ }
116
+ end
117
+
118
+ let(:expected_resource) { document }
119
+
120
+ let(:extra_params) do
121
+ {
122
+ id: document.id,
123
+ document: {
124
+ name: 'New Name'
125
+ }
126
+ }
127
+ end
128
+
129
+ let(:expected_json) do
130
+ {
131
+ 'name' => 'New Name!'
132
+ }
133
+ end
134
+
135
+ it 'updates the values given by request' do
136
+ expect { handler.process }
137
+ .to change { document.reload.name }
138
+ .from(document.name)
139
+ .to('New Name!')
140
+ end
141
+ end
142
+ end
143
+ end
144
+
33
145
  context 'with before_save block option' do
34
146
  it_behaves_like 'a request handler' do
35
147
  let(:block) do
@@ -67,5 +67,15 @@ describe Azeroth::RequestHandler do
67
67
  expect(controller).not_to have_received(:render)
68
68
  end
69
69
  end
70
+
71
+ context 'with format js' do
72
+ let(:format) { 'js' }
73
+
74
+ it do
75
+ handler.process
76
+
77
+ expect(controller).not_to have_received(:render)
78
+ end
79
+ end
70
80
  end
71
81
  end
@@ -28,4 +28,10 @@ class RequestHandlerController < ActionController::Base
28
28
  documents.where(reference: 'X-MAGIC-15')
29
29
  .build(document_params)
30
30
  end
31
+
32
+ def add_bang_name
33
+ document.assign_attributes(document_params)
34
+ document.name = "#{document.name}!"
35
+ document.save
36
+ end
31
37
  end
@@ -24,6 +24,8 @@ shared_examples 'a request handler' do |status: :ok|
24
24
  { format: format }.merge(extra_params)
25
25
  end
26
26
 
27
+ let(:controller_headers) { {} }
28
+
27
29
  before do
28
30
  create_list(:document, documents_count)
29
31
 
@@ -33,6 +35,9 @@ shared_examples 'a request handler' do |status: :ok|
33
35
  allow(controller).to receive(:render)
34
36
  .with(json: expected_json, status: status)
35
37
  .and_return(expected_json)
38
+
39
+ allow(controller).to receive(:headers)
40
+ .and_return(controller_headers)
36
41
  end
37
42
 
38
43
  it 'returns all documents json' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: azeroth
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Darthjee
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-11 00:00:00.000000000 Z
11
+ date: 2022-05-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -128,14 +128,14 @@ dependencies:
128
128
  requirements:
129
129
  - - '='
130
130
  - !ruby/object:Gem::Version
131
- version: 1.11.4
131
+ version: 1.12.5
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - '='
137
137
  - !ruby/object:Gem::Version
138
- version: 1.11.4
138
+ version: 1.12.5
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: pry
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -456,6 +456,7 @@ files:
456
456
  - config/yardstick.yml
457
457
  - docker-compose.yml
458
458
  - lib/azeroth.rb
459
+ - lib/azeroth/controller_interface.rb
459
460
  - lib/azeroth/decorator.rb
460
461
  - lib/azeroth/decorator/hash_builder.rb
461
462
  - lib/azeroth/decorator/key_value_extractor.rb
@@ -484,6 +485,7 @@ files:
484
485
  - spec/controllers/paginated_documents_controller_spec.rb
485
486
  - spec/controllers/pokemon_masters_controller_spec.rb
486
487
  - spec/controllers/pokemons_controller_spec.rb
488
+ - spec/controllers/rendering_controller_spec.rb
487
489
  - spec/dummy/.ruby-version
488
490
  - spec/dummy/Rakefile
489
491
  - spec/dummy/app/assets/config/manifest.js
@@ -504,6 +506,7 @@ files:
504
506
  - spec/dummy/app/controllers/pokemon_masters_controller.rb
505
507
  - spec/dummy/app/controllers/pokemons_controller.rb
506
508
  - spec/dummy/app/controllers/publishers_controller.rb
509
+ - spec/dummy/app/controllers/rendering_controller.rb
507
510
  - spec/dummy/app/helpers/application_helper.rb
508
511
  - spec/dummy/app/jobs/application_job.rb
509
512
  - spec/dummy/app/mailers/application_mailer.rb
@@ -537,6 +540,8 @@ files:
537
540
  - spec/dummy/app/views/layouts/application.html.erb
538
541
  - spec/dummy/app/views/layouts/mailer.html.erb
539
542
  - spec/dummy/app/views/layouts/mailer.text.erb
543
+ - spec/dummy/app/views/rendering/index.html.erb
544
+ - spec/dummy/app/views/rendering/show.html.erb
540
545
  - spec/dummy/bin/bundle
541
546
  - spec/dummy/bin/rails
542
547
  - spec/dummy/bin/rake
@@ -583,6 +588,7 @@ files:
583
588
  - spec/integration/readme/controllers/games_controller_spec.rb
584
589
  - spec/integration/yard/azeroth/decorator_spec.rb
585
590
  - spec/integration/yard/controllers/games_controller_spec.rb
591
+ - spec/lib/azeroth/controller_interface_spec.rb
586
592
  - spec/lib/azeroth/decorator/hash_builder_spec.rb
587
593
  - spec/lib/azeroth/decorator/key_value_extractor_spec.rb
588
594
  - spec/lib/azeroth/decorator/method_builder_spec.rb
@@ -649,6 +655,7 @@ test_files:
649
655
  - spec/controllers/paginated_documents_controller_spec.rb
650
656
  - spec/controllers/pokemon_masters_controller_spec.rb
651
657
  - spec/controllers/pokemons_controller_spec.rb
658
+ - spec/controllers/rendering_controller_spec.rb
652
659
  - spec/dummy/.ruby-version
653
660
  - spec/dummy/Rakefile
654
661
  - spec/dummy/app/assets/config/manifest.js
@@ -669,6 +676,7 @@ test_files:
669
676
  - spec/dummy/app/controllers/pokemon_masters_controller.rb
670
677
  - spec/dummy/app/controllers/pokemons_controller.rb
671
678
  - spec/dummy/app/controllers/publishers_controller.rb
679
+ - spec/dummy/app/controllers/rendering_controller.rb
672
680
  - spec/dummy/app/helpers/application_helper.rb
673
681
  - spec/dummy/app/jobs/application_job.rb
674
682
  - spec/dummy/app/mailers/application_mailer.rb
@@ -702,6 +710,8 @@ test_files:
702
710
  - spec/dummy/app/views/layouts/application.html.erb
703
711
  - spec/dummy/app/views/layouts/mailer.html.erb
704
712
  - spec/dummy/app/views/layouts/mailer.text.erb
713
+ - spec/dummy/app/views/rendering/index.html.erb
714
+ - spec/dummy/app/views/rendering/show.html.erb
705
715
  - spec/dummy/bin/bundle
706
716
  - spec/dummy/bin/rails
707
717
  - spec/dummy/bin/rake
@@ -748,6 +758,7 @@ test_files:
748
758
  - spec/integration/readme/controllers/games_controller_spec.rb
749
759
  - spec/integration/yard/azeroth/decorator_spec.rb
750
760
  - spec/integration/yard/controllers/games_controller_spec.rb
761
+ - spec/lib/azeroth/controller_interface_spec.rb
751
762
  - spec/lib/azeroth/decorator/hash_builder_spec.rb
752
763
  - spec/lib/azeroth/decorator/key_value_extractor_spec.rb
753
764
  - spec/lib/azeroth/decorator/method_builder_spec.rb