azeroth 0.7.1 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +2 -2
- data/Dockerfile +1 -1
- data/README.md +4 -1
- data/azeroth.gemspec +28 -26
- data/lib/azeroth/decorator.rb +2 -3
- data/lib/azeroth/decorator/method_builder.rb +26 -0
- data/lib/azeroth/options.rb +38 -2
- data/lib/azeroth/request_handler/index.rb +46 -0
- data/lib/azeroth/version.rb +1 -1
- data/spec/controllers/documents_controller_spec.rb +1 -1
- data/spec/controllers/documents_with_error_controller_spec.rb +1 -1
- data/spec/controllers/index_documents_controller_spec.rb +12 -1
- data/spec/controllers/paginated_documents_controller_spec.rb +97 -0
- data/spec/dummy/app/controllers/paginated_documents_controller.rb +7 -0
- data/spec/dummy/config/routes.rb +1 -0
- data/spec/lib/azeroth/decorator/method_builder_spec.rb +23 -0
- data/spec/lib/azeroth/request_handler/create_spec.rb +106 -0
- data/spec/lib/azeroth/request_handler/index_spec.rb +43 -0
- data/spec/lib/azeroth/request_handler_spec.rb +1 -1
- data/spec/spec_helper.rb +2 -0
- data/spec/support/app/controllers/request_handler_controller.rb +5 -0
- data/spec/support/app/workers/worker.rb +5 -0
- data/spec/support/shared_examples/request_handler.rb +1 -1
- metadata +71 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '09152b8053d40bd19405c5b7165458483d4304310fa5ec64c0d2b5723dda0067'
|
4
|
+
data.tar.gz: 1a1039542352929720e5cc7ae1242932b7d2a65856e2156b14a36d1a8bb1722b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ae5257e2851ccbbadbd79d9a0c0a13be63e392b2af16c6e1f66be399ee00bc51b06f9682f25d88648f3a32d2c07451d456d80035f04b48a4cc471d27a572e59
|
7
|
+
data.tar.gz: d7c01b81ce09615d65cc451d2a1669ac9d843d18d75fbb0c12c2e4356507fce62288145bd30295674619a0649327b1b69568fede8adb452e602073f67659235e
|
data/.circleci/config.yml
CHANGED
@@ -18,7 +18,7 @@ workflows:
|
|
18
18
|
jobs:
|
19
19
|
test:
|
20
20
|
docker:
|
21
|
-
- image: darthjee/circleci_rails_gems:0.
|
21
|
+
- image: darthjee/circleci_rails_gems:0.6.3
|
22
22
|
environment:
|
23
23
|
PROJECT: azeroth
|
24
24
|
steps:
|
@@ -52,7 +52,7 @@ jobs:
|
|
52
52
|
command: check_specs
|
53
53
|
build-and-release:
|
54
54
|
docker:
|
55
|
-
- image: darthjee/circleci_rails_gems:0.
|
55
|
+
- image: darthjee/circleci_rails_gems:0.6.3
|
56
56
|
environment:
|
57
57
|
PROJECT: azeroth
|
58
58
|
steps:
|
data/Dockerfile
CHANGED
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.
|
14
|
+
[https://www.rubydoc.info/gems/azeroth/0.8.0](https://www.rubydoc.info/gems/azeroth/0.8.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
|
@@ -59,7 +59,10 @@ It accepts options
|
|
59
59
|
- except: List of actions to not to be built
|
60
60
|
- decorator: Decorator class or flag allowing/disallowing decorators
|
61
61
|
- before_save: Method/Proc to be ran before saving the resource on create or update
|
62
|
+
- after_save: Method/Proc to be ran after saving the resource on create or update
|
62
63
|
- build_with: Method/Block to be ran when building the reource on create
|
64
|
+
- paginated: Flag when pagination should be applied
|
65
|
+
- per_page: Number of items returned when pagination is active
|
63
66
|
|
64
67
|
```ruby
|
65
68
|
# publishers_controller.rb
|
data/azeroth.gemspec
CHANGED
@@ -18,33 +18,35 @@ Gem::Specification.new do |gem|
|
|
18
18
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
19
19
|
gem.require_paths = ['lib']
|
20
20
|
|
21
|
-
gem.add_runtime_dependency 'activesupport', '~> 5.2.
|
21
|
+
gem.add_runtime_dependency 'activesupport', '~> 5.2.x'
|
22
22
|
gem.add_runtime_dependency 'darthjee-active_ext', '>= 1.3.2'
|
23
23
|
gem.add_runtime_dependency 'jace', '>= 0.0.3'
|
24
|
-
gem.add_runtime_dependency 'sinclair', '>= 1.6.
|
24
|
+
gem.add_runtime_dependency 'sinclair', '>= 1.6.7'
|
25
25
|
|
26
|
-
gem.add_development_dependency 'actionpack',
|
27
|
-
gem.add_development_dependency 'activerecord',
|
28
|
-
gem.add_development_dependency 'bundler',
|
29
|
-
gem.add_development_dependency 'factory_bot',
|
30
|
-
gem.add_development_dependency 'nokogiri',
|
31
|
-
gem.add_development_dependency 'pry',
|
32
|
-
gem.add_development_dependency 'pry-nav',
|
33
|
-
gem.add_development_dependency 'rails',
|
34
|
-
gem.add_development_dependency 'rails-controller-testing',
|
35
|
-
gem.add_development_dependency 'rake',
|
36
|
-
gem.add_development_dependency 'reek',
|
37
|
-
gem.add_development_dependency 'rspec',
|
38
|
-
gem.add_development_dependency 'rspec-
|
39
|
-
gem.add_development_dependency 'rspec-
|
40
|
-
gem.add_development_dependency 'rspec-
|
41
|
-
gem.add_development_dependency 'rspec-
|
42
|
-
gem.add_development_dependency 'rspec-
|
43
|
-
gem.add_development_dependency '
|
44
|
-
gem.add_development_dependency 'rubocop
|
45
|
-
gem.add_development_dependency '
|
46
|
-
gem.add_development_dependency '
|
47
|
-
gem.add_development_dependency '
|
48
|
-
gem.add_development_dependency '
|
49
|
-
gem.add_development_dependency '
|
26
|
+
gem.add_development_dependency 'actionpack', '~> 5.2.x'
|
27
|
+
gem.add_development_dependency 'activerecord', '~> 5.2.x'
|
28
|
+
gem.add_development_dependency 'bundler', '1.16.1'
|
29
|
+
gem.add_development_dependency 'factory_bot', '5.2.0'
|
30
|
+
gem.add_development_dependency 'nokogiri', '1.11.4'
|
31
|
+
gem.add_development_dependency 'pry', '0.12.2'
|
32
|
+
gem.add_development_dependency 'pry-nav', '0.3.0'
|
33
|
+
gem.add_development_dependency 'rails', '~> 5.2.x'
|
34
|
+
gem.add_development_dependency 'rails-controller-testing', '1.0.4'
|
35
|
+
gem.add_development_dependency 'rake', '13.0.3'
|
36
|
+
gem.add_development_dependency 'reek', '6.0.3'
|
37
|
+
gem.add_development_dependency 'rspec', '3.9.0'
|
38
|
+
gem.add_development_dependency 'rspec-collection_matchers', '1.2.0'
|
39
|
+
gem.add_development_dependency 'rspec-core', '3.9.3'
|
40
|
+
gem.add_development_dependency 'rspec-expectations', '3.9.4'
|
41
|
+
gem.add_development_dependency 'rspec-mocks', '3.9.1'
|
42
|
+
gem.add_development_dependency 'rspec-rails', '3.9.0'
|
43
|
+
gem.add_development_dependency 'rspec-support', '3.9.4'
|
44
|
+
gem.add_development_dependency 'rubocop', '0.80.1'
|
45
|
+
gem.add_development_dependency 'rubocop-rspec', '1.38.1'
|
46
|
+
gem.add_development_dependency 'rubycritic', '4.6.1'
|
47
|
+
gem.add_development_dependency 'shoulda-matchers', '4.3.0'
|
48
|
+
gem.add_development_dependency 'simplecov', '0.17.1'
|
49
|
+
gem.add_development_dependency 'sqlite3', '1.4.2'
|
50
|
+
gem.add_development_dependency 'yard', '0.9.26'
|
51
|
+
gem.add_development_dependency 'yardstick', '0.9.9'
|
50
52
|
end
|
data/lib/azeroth/decorator.rb
CHANGED
@@ -42,6 +42,7 @@ module Azeroth
|
|
42
42
|
class Decorator
|
43
43
|
autoload :HashBuilder, 'azeroth/decorator/hash_builder'
|
44
44
|
autoload :KeyValueExtractor, 'azeroth/decorator/key_value_extractor'
|
45
|
+
autoload :MethodBuilder, 'azeroth/decorator/method_builder'
|
45
46
|
autoload :Options, 'azeroth/decorator/options'
|
46
47
|
|
47
48
|
class << self
|
@@ -228,9 +229,7 @@ module Azeroth
|
|
228
229
|
def expose(attribute, **options_hash)
|
229
230
|
options = Decorator::Options.new(options_hash)
|
230
231
|
|
231
|
-
|
232
|
-
builder.add_method(attribute, "@object.#{attribute}")
|
233
|
-
builder.build
|
232
|
+
MethodBuilder.build_reader(self, attribute)
|
234
233
|
|
235
234
|
attributes_map[attribute] = options
|
236
235
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sinclair'
|
4
|
+
|
5
|
+
module Azeroth
|
6
|
+
class Decorator
|
7
|
+
# Responsible for building readers for attributes
|
8
|
+
# @api private
|
9
|
+
class MethodBuilder < Sinclair
|
10
|
+
# Builds reader
|
11
|
+
#
|
12
|
+
# reaader delegate method calls to @object
|
13
|
+
#
|
14
|
+
# @return (see Sinclair#build)
|
15
|
+
def self.build_reader(klass, attribute)
|
16
|
+
new(klass).build_reader(attribute)
|
17
|
+
end
|
18
|
+
|
19
|
+
# (see MethodBuilder.build_reader)
|
20
|
+
def build_reader(attribute)
|
21
|
+
add_method(attribute, "@object.#{attribute}")
|
22
|
+
build
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/azeroth/options.rb
CHANGED
@@ -19,7 +19,10 @@ module Azeroth
|
|
19
19
|
except: [],
|
20
20
|
decorator: true,
|
21
21
|
before_save: nil,
|
22
|
-
|
22
|
+
after_save: nil,
|
23
|
+
build_with: nil,
|
24
|
+
paginated: false,
|
25
|
+
per_page: 20
|
23
26
|
}.freeze
|
24
27
|
|
25
28
|
with_options DEFAULT_OPTIONS
|
@@ -40,10 +43,18 @@ module Azeroth
|
|
40
43
|
# @return [Jace::Dispatcher]
|
41
44
|
def event_dispatcher(event)
|
42
45
|
Jace::Dispatcher.new(
|
43
|
-
before: try("before_#{event}")
|
46
|
+
before: try("before_#{event}"),
|
47
|
+
after: try("after_#{event}")
|
44
48
|
)
|
45
49
|
end
|
46
50
|
|
51
|
+
alias paginated? paginated
|
52
|
+
# @method paginated?
|
53
|
+
# @api private
|
54
|
+
#
|
55
|
+
# @see paginated
|
56
|
+
# @return [TrueClass,FalseClass]
|
57
|
+
|
47
58
|
# @method only
|
48
59
|
# @api private
|
49
60
|
#
|
@@ -81,11 +92,36 @@ module Azeroth
|
|
81
92
|
#
|
82
93
|
# @return [Symbol,Proc]
|
83
94
|
|
95
|
+
# @method after_save
|
96
|
+
# @api private
|
97
|
+
#
|
98
|
+
# Block or method name to be run after save
|
99
|
+
#
|
100
|
+
# The given method or block will be ran
|
101
|
+
# after committing changes in models
|
102
|
+
# to database
|
103
|
+
#
|
104
|
+
# @return [Symbol,Proc]
|
105
|
+
|
84
106
|
# @method build_with
|
85
107
|
# @api private
|
86
108
|
#
|
87
109
|
# Block or method name to be ran when building the resource
|
88
110
|
#
|
89
111
|
# @return [Symbol,Proc]
|
112
|
+
|
113
|
+
# @method paginated
|
114
|
+
# @api private
|
115
|
+
#
|
116
|
+
# Boolean indicating if pagination should or not be used
|
117
|
+
#
|
118
|
+
# @return [TrueClass,FalseClass]
|
119
|
+
|
120
|
+
# @method per_page
|
121
|
+
# @api private
|
122
|
+
#
|
123
|
+
# Number of elements when pagination is active
|
124
|
+
#
|
125
|
+
# @return [Integer]
|
90
126
|
end
|
91
127
|
end
|
@@ -8,12 +8,58 @@ module Azeroth
|
|
8
8
|
class Index < RequestHandler
|
9
9
|
private
|
10
10
|
|
11
|
+
delegate :paginated?, :per_page, to: :options
|
12
|
+
|
11
13
|
# @private
|
12
14
|
#
|
13
15
|
# return a collection of the model
|
14
16
|
#
|
15
17
|
# @return [Enumerable<Object>]
|
16
18
|
def resource
|
19
|
+
return scoped_entries unless paginated?
|
20
|
+
|
21
|
+
paginated_entries
|
22
|
+
end
|
23
|
+
|
24
|
+
# @private
|
25
|
+
#
|
26
|
+
# paginated collection of the model
|
27
|
+
#
|
28
|
+
# @return [Enumerable<Object>]
|
29
|
+
def paginated_entries
|
30
|
+
scoped_entries.offset(offset).limit(limit)
|
31
|
+
end
|
32
|
+
|
33
|
+
# @private
|
34
|
+
#
|
35
|
+
# offest used in pagination
|
36
|
+
#
|
37
|
+
# offset is retrieved from +params[:per_page]+
|
38
|
+
# or +options.per_page+
|
39
|
+
#
|
40
|
+
# @return [Integer]
|
41
|
+
def offset
|
42
|
+
page = (params[:page] || 1).to_i - 1
|
43
|
+
page * limit
|
44
|
+
end
|
45
|
+
|
46
|
+
# @private
|
47
|
+
#
|
48
|
+
# limit used in pagination
|
49
|
+
#
|
50
|
+
# limit is retrieved from +params[:page]+
|
51
|
+
#
|
52
|
+
# @return [Integer]
|
53
|
+
def limit
|
54
|
+
(params[:per_page] || per_page).to_i
|
55
|
+
end
|
56
|
+
|
57
|
+
# @private
|
58
|
+
#
|
59
|
+
# default scope of elements
|
60
|
+
#
|
61
|
+
# @return [Enumerable<Object>]
|
62
|
+
def scoped_entries
|
17
63
|
controller.send(model.plural)
|
18
64
|
end
|
19
65
|
end
|
data/lib/azeroth/version.rb
CHANGED
@@ -10,7 +10,7 @@ describe IndexDocumentsController do
|
|
10
10
|
describe 'GET index' do
|
11
11
|
let(:documents_count) { 0 }
|
12
12
|
let!(:documents) do
|
13
|
-
|
13
|
+
create_list(:document, documents_count)
|
14
14
|
end
|
15
15
|
|
16
16
|
let(:expected_json) do
|
@@ -37,6 +37,17 @@ describe IndexDocumentsController do
|
|
37
37
|
expect(parsed_response).to eq(expected_json)
|
38
38
|
end
|
39
39
|
end
|
40
|
+
|
41
|
+
context 'when there are more documents than expected pagination' do
|
42
|
+
let(:documents_count) { Random.rand(21..30) }
|
43
|
+
|
44
|
+
it { expect(response).to be_successful }
|
45
|
+
|
46
|
+
it 'returns all documents' do
|
47
|
+
expect(parsed_response)
|
48
|
+
.to have(documents_count).elements
|
49
|
+
end
|
50
|
+
end
|
40
51
|
end
|
41
52
|
end
|
42
53
|
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe PaginatedDocumentsController 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
|
+
let!(:documents) do
|
13
|
+
create_list(:document, documents_count)
|
14
|
+
end
|
15
|
+
|
16
|
+
let(:expected_json) do
|
17
|
+
Document::Decorator.new(documents).as_json
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'when calling on format json' do
|
21
|
+
let(:parameters) { {} }
|
22
|
+
|
23
|
+
before do
|
24
|
+
get :index, params: parameters.merge(format: :json)
|
25
|
+
end
|
26
|
+
|
27
|
+
it { expect(response).to be_successful }
|
28
|
+
|
29
|
+
it 'returns empty array' do
|
30
|
+
expect(parsed_response).to eq(expected_json)
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'when there is a document' do
|
34
|
+
let(:documents_count) { 1 }
|
35
|
+
|
36
|
+
it { expect(response).to be_successful }
|
37
|
+
|
38
|
+
it 'renders documents json' do
|
39
|
+
expect(parsed_response).to eq(expected_json)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'when there are more documents than expected pagination' do
|
44
|
+
let(:documents_count) { Random.rand(21..30) }
|
45
|
+
|
46
|
+
it { expect(response).to be_successful }
|
47
|
+
|
48
|
+
it 'returns paginated documents' do
|
49
|
+
expect(parsed_response)
|
50
|
+
.not_to have(documents_count).elements
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'returns full page of documents' do
|
54
|
+
expect(parsed_response)
|
55
|
+
.to have(20).elements
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'when page is given' do
|
60
|
+
let(:documents_count) { Random.rand(21..30) }
|
61
|
+
let(:parameters) { { page: 2 } }
|
62
|
+
|
63
|
+
it { expect(response).to be_successful }
|
64
|
+
|
65
|
+
it 'returns paginated documents' do
|
66
|
+
expect(parsed_response)
|
67
|
+
.not_to have(documents_count).elements
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'returns full page of documents' do
|
71
|
+
expect(parsed_response)
|
72
|
+
.to have(documents_count - 20)
|
73
|
+
.elements
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context 'when per_page is given' do
|
78
|
+
let(:documents_count) { Random.rand(21..30) }
|
79
|
+
let(:per_page) { Random.rand(5..15) }
|
80
|
+
let(:parameters) { { per_page: per_page } }
|
81
|
+
|
82
|
+
it { expect(response).to be_successful }
|
83
|
+
|
84
|
+
it 'returns paginated documents' do
|
85
|
+
expect(parsed_response)
|
86
|
+
.not_to have(documents_count).elements
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'returns full page of documents' do
|
90
|
+
expect(parsed_response)
|
91
|
+
.to have(per_page)
|
92
|
+
.elements
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
data/spec/dummy/config/routes.rb
CHANGED
@@ -4,6 +4,7 @@ Rails.application.routes.draw do
|
|
4
4
|
resources :documents
|
5
5
|
resources :public_documents, controller: :index_documents
|
6
6
|
resources :create_documents, controller: :documents_with_error
|
7
|
+
resources :paginated_documents
|
7
8
|
|
8
9
|
resources :publishers, only: %i[create index] do
|
9
10
|
resources :games, except: :delete
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Azeroth::Decorator::MethodBuilder do
|
6
|
+
let(:decorator_class) { Class.new(Azeroth::Decorator) }
|
7
|
+
let(:decorator) { decorator_class.new(object) }
|
8
|
+
let(:model) { build(:dummy_model) }
|
9
|
+
let(:object) { model }
|
10
|
+
|
11
|
+
describe '.build_reader' do
|
12
|
+
it do
|
13
|
+
expect { described_class.build_reader(decorator_class, :age) }
|
14
|
+
.to add_method(:age).to(decorator)
|
15
|
+
end
|
16
|
+
|
17
|
+
it do
|
18
|
+
described_class.build_reader(decorator_class, :age)
|
19
|
+
|
20
|
+
expect(decorator.age).to eq(model.age)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -106,6 +106,112 @@ describe Azeroth::RequestHandler::Create do
|
|
106
106
|
end
|
107
107
|
end
|
108
108
|
end
|
109
|
+
|
110
|
+
context 'with after_save block option' do
|
111
|
+
it_behaves_like 'a request handler', status: :created do
|
112
|
+
let(:block) do
|
113
|
+
value = 10
|
114
|
+
proc do
|
115
|
+
document.update(reference: "X-MAGIC-#{value}")
|
116
|
+
Worker.perform(document.id)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
let(:options_hash) do
|
121
|
+
{
|
122
|
+
after_save: block
|
123
|
+
}
|
124
|
+
end
|
125
|
+
|
126
|
+
let(:extra_params) do
|
127
|
+
{
|
128
|
+
document: {
|
129
|
+
name: 'My Document'
|
130
|
+
}
|
131
|
+
}
|
132
|
+
end
|
133
|
+
|
134
|
+
let(:expected_json) do
|
135
|
+
{
|
136
|
+
'name' => 'My Document',
|
137
|
+
'reference' => 'X-MAGIC-10'
|
138
|
+
}
|
139
|
+
end
|
140
|
+
|
141
|
+
before do
|
142
|
+
allow(Worker).to receive(:perform)
|
143
|
+
end
|
144
|
+
|
145
|
+
it 'creates entry' do
|
146
|
+
expect { handler.process }
|
147
|
+
.to change(Document, :count)
|
148
|
+
.by(1)
|
149
|
+
end
|
150
|
+
|
151
|
+
it 'trigger workers after saving' do
|
152
|
+
handler.process
|
153
|
+
|
154
|
+
expect(Worker).to have_received(:perform)
|
155
|
+
.with(Document.last.id)
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'changes entry after saving' do
|
159
|
+
handler.process
|
160
|
+
|
161
|
+
expect(Document.last.reference)
|
162
|
+
.to eq('X-MAGIC-10')
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
context 'with after_save symbol option' do
|
168
|
+
it_behaves_like 'a request handler', status: :created do
|
169
|
+
let(:options_hash) do
|
170
|
+
{
|
171
|
+
after_save: :add_magic_reference_and_trigger
|
172
|
+
}
|
173
|
+
end
|
174
|
+
|
175
|
+
let(:extra_params) do
|
176
|
+
{
|
177
|
+
document: {
|
178
|
+
name: 'My Document'
|
179
|
+
}
|
180
|
+
}
|
181
|
+
end
|
182
|
+
|
183
|
+
let(:expected_json) do
|
184
|
+
{
|
185
|
+
'name' => 'My Document',
|
186
|
+
'reference' => 'X-MAGIC-15'
|
187
|
+
}
|
188
|
+
end
|
189
|
+
|
190
|
+
before do
|
191
|
+
allow(Worker).to receive(:perform)
|
192
|
+
end
|
193
|
+
|
194
|
+
it 'creates entry' do
|
195
|
+
expect { handler.process }
|
196
|
+
.to change(Document, :count)
|
197
|
+
.by(1)
|
198
|
+
end
|
199
|
+
|
200
|
+
it 'trigger workers after saving' do
|
201
|
+
handler.process
|
202
|
+
|
203
|
+
expect(Worker).to have_received(:perform)
|
204
|
+
.with(Document.last.id)
|
205
|
+
end
|
206
|
+
|
207
|
+
it 'changes entry after saving' do
|
208
|
+
handler.process
|
209
|
+
|
210
|
+
expect(Document.last.reference)
|
211
|
+
.to eq('X-MAGIC-15')
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
109
215
|
end
|
110
216
|
|
111
217
|
context 'with build_with as symbol' do
|
@@ -8,5 +8,48 @@ describe Azeroth::RequestHandler::Index do
|
|
8
8
|
let(:documents_count) { 3 }
|
9
9
|
let(:expected_resource) { Document.all }
|
10
10
|
end
|
11
|
+
|
12
|
+
context 'when pagination is active' do
|
13
|
+
it_behaves_like 'a request handler' do
|
14
|
+
let(:documents_count) { Random.rand(21..30) }
|
15
|
+
let(:expected_resource) { Document.all.limit(20) }
|
16
|
+
let(:options_hash) { { paginated: true } }
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'when page is given' do
|
20
|
+
it_behaves_like 'a request handler' do
|
21
|
+
let(:documents_count) { Random.rand(41..50) }
|
22
|
+
let(:expected_resource) { Document.all.offset(20).limit(20) }
|
23
|
+
let(:options_hash) { { paginated: true } }
|
24
|
+
let(:extra_params) { { page: '2' } }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'when third page is given' do
|
29
|
+
it_behaves_like 'a request handler' do
|
30
|
+
let(:documents_count) { Random.rand(41..50) }
|
31
|
+
let(:expected_resource) { Document.all.offset(40) }
|
32
|
+
let(:options_hash) { { paginated: true } }
|
33
|
+
let(:extra_params) { { page: '3' } }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'when per_page is not default' do
|
38
|
+
it_behaves_like 'a request handler' do
|
39
|
+
let(:documents_count) { Random.rand(21..30) }
|
40
|
+
let(:expected_resource) { Document.all.limit(10) }
|
41
|
+
let(:options_hash) { { paginated: true, per_page: 10 } }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'when per page is given in params' do
|
46
|
+
it_behaves_like 'a request handler' do
|
47
|
+
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' } }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
11
54
|
end
|
12
55
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -18,6 +18,8 @@ require File.expand_path('spec/dummy/db/schema.rb')
|
|
18
18
|
require 'rspec/rails'
|
19
19
|
require 'active_support/railtie'
|
20
20
|
require 'sinclair/matchers'
|
21
|
+
require 'shoulda-matchers'
|
22
|
+
require 'rspec/collection_matchers'
|
21
23
|
|
22
24
|
support_files = File.expand_path('spec/support/**/*.rb')
|
23
25
|
Dir[support_files].sort.each { |file| require file }
|
@@ -19,6 +19,11 @@ class RequestHandlerController < ActionController::Base
|
|
19
19
|
document.reference = 'X-MAGIC-15'
|
20
20
|
end
|
21
21
|
|
22
|
+
def add_magic_reference_and_trigger
|
23
|
+
document.update(reference: 'X-MAGIC-15')
|
24
|
+
Worker.perform(document.id)
|
25
|
+
end
|
26
|
+
|
22
27
|
def build_magic_document
|
23
28
|
documents.where(reference: 'X-MAGIC-15')
|
24
29
|
.build(document_params)
|
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.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Darthjee
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 5.2.
|
19
|
+
version: 5.2.x
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 5.2.
|
26
|
+
version: 5.2.x
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: darthjee-active_ext
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -58,42 +58,42 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 1.6.
|
61
|
+
version: 1.6.7
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 1.6.
|
68
|
+
version: 1.6.7
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: actionpack
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 5.2.
|
75
|
+
version: 5.2.x
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 5.2.
|
82
|
+
version: 5.2.x
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: activerecord
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 5.2.
|
89
|
+
version: 5.2.x
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 5.2.
|
96
|
+
version: 5.2.x
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: bundler
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -128,14 +128,14 @@ dependencies:
|
|
128
128
|
requirements:
|
129
129
|
- - '='
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: 1.
|
131
|
+
version: 1.11.4
|
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.
|
138
|
+
version: 1.11.4
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: pry
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -168,16 +168,16 @@ dependencies:
|
|
168
168
|
name: rails
|
169
169
|
requirement: !ruby/object:Gem::Requirement
|
170
170
|
requirements:
|
171
|
-
- -
|
171
|
+
- - "~>"
|
172
172
|
- !ruby/object:Gem::Version
|
173
|
-
version: 5.2.
|
173
|
+
version: 5.2.x
|
174
174
|
type: :development
|
175
175
|
prerelease: false
|
176
176
|
version_requirements: !ruby/object:Gem::Requirement
|
177
177
|
requirements:
|
178
|
-
- -
|
178
|
+
- - "~>"
|
179
179
|
- !ruby/object:Gem::Version
|
180
|
-
version: 5.2.
|
180
|
+
version: 5.2.x
|
181
181
|
- !ruby/object:Gem::Dependency
|
182
182
|
name: rails-controller-testing
|
183
183
|
requirement: !ruby/object:Gem::Requirement
|
@@ -198,28 +198,28 @@ dependencies:
|
|
198
198
|
requirements:
|
199
199
|
- - '='
|
200
200
|
- !ruby/object:Gem::Version
|
201
|
-
version: 13.0.
|
201
|
+
version: 13.0.3
|
202
202
|
type: :development
|
203
203
|
prerelease: false
|
204
204
|
version_requirements: !ruby/object:Gem::Requirement
|
205
205
|
requirements:
|
206
206
|
- - '='
|
207
207
|
- !ruby/object:Gem::Version
|
208
|
-
version: 13.0.
|
208
|
+
version: 13.0.3
|
209
209
|
- !ruby/object:Gem::Dependency
|
210
210
|
name: reek
|
211
211
|
requirement: !ruby/object:Gem::Requirement
|
212
212
|
requirements:
|
213
213
|
- - '='
|
214
214
|
- !ruby/object:Gem::Version
|
215
|
-
version:
|
215
|
+
version: 6.0.3
|
216
216
|
type: :development
|
217
217
|
prerelease: false
|
218
218
|
version_requirements: !ruby/object:Gem::Requirement
|
219
219
|
requirements:
|
220
220
|
- - '='
|
221
221
|
- !ruby/object:Gem::Version
|
222
|
-
version:
|
222
|
+
version: 6.0.3
|
223
223
|
- !ruby/object:Gem::Dependency
|
224
224
|
name: rspec
|
225
225
|
requirement: !ruby/object:Gem::Requirement
|
@@ -234,34 +234,48 @@ dependencies:
|
|
234
234
|
- - '='
|
235
235
|
- !ruby/object:Gem::Version
|
236
236
|
version: 3.9.0
|
237
|
+
- !ruby/object:Gem::Dependency
|
238
|
+
name: rspec-collection_matchers
|
239
|
+
requirement: !ruby/object:Gem::Requirement
|
240
|
+
requirements:
|
241
|
+
- - '='
|
242
|
+
- !ruby/object:Gem::Version
|
243
|
+
version: 1.2.0
|
244
|
+
type: :development
|
245
|
+
prerelease: false
|
246
|
+
version_requirements: !ruby/object:Gem::Requirement
|
247
|
+
requirements:
|
248
|
+
- - '='
|
249
|
+
- !ruby/object:Gem::Version
|
250
|
+
version: 1.2.0
|
237
251
|
- !ruby/object:Gem::Dependency
|
238
252
|
name: rspec-core
|
239
253
|
requirement: !ruby/object:Gem::Requirement
|
240
254
|
requirements:
|
241
255
|
- - '='
|
242
256
|
- !ruby/object:Gem::Version
|
243
|
-
version: 3.9.
|
257
|
+
version: 3.9.3
|
244
258
|
type: :development
|
245
259
|
prerelease: false
|
246
260
|
version_requirements: !ruby/object:Gem::Requirement
|
247
261
|
requirements:
|
248
262
|
- - '='
|
249
263
|
- !ruby/object:Gem::Version
|
250
|
-
version: 3.9.
|
264
|
+
version: 3.9.3
|
251
265
|
- !ruby/object:Gem::Dependency
|
252
266
|
name: rspec-expectations
|
253
267
|
requirement: !ruby/object:Gem::Requirement
|
254
268
|
requirements:
|
255
269
|
- - '='
|
256
270
|
- !ruby/object:Gem::Version
|
257
|
-
version: 3.9.
|
271
|
+
version: 3.9.4
|
258
272
|
type: :development
|
259
273
|
prerelease: false
|
260
274
|
version_requirements: !ruby/object:Gem::Requirement
|
261
275
|
requirements:
|
262
276
|
- - '='
|
263
277
|
- !ruby/object:Gem::Version
|
264
|
-
version: 3.9.
|
278
|
+
version: 3.9.4
|
265
279
|
- !ruby/object:Gem::Dependency
|
266
280
|
name: rspec-mocks
|
267
281
|
requirement: !ruby/object:Gem::Requirement
|
@@ -296,14 +310,14 @@ dependencies:
|
|
296
310
|
requirements:
|
297
311
|
- - '='
|
298
312
|
- !ruby/object:Gem::Version
|
299
|
-
version: 3.9.
|
313
|
+
version: 3.9.4
|
300
314
|
type: :development
|
301
315
|
prerelease: false
|
302
316
|
version_requirements: !ruby/object:Gem::Requirement
|
303
317
|
requirements:
|
304
318
|
- - '='
|
305
319
|
- !ruby/object:Gem::Version
|
306
|
-
version: 3.9.
|
320
|
+
version: 3.9.4
|
307
321
|
- !ruby/object:Gem::Dependency
|
308
322
|
name: rubocop
|
309
323
|
requirement: !ruby/object:Gem::Requirement
|
@@ -338,14 +352,28 @@ dependencies:
|
|
338
352
|
requirements:
|
339
353
|
- - '='
|
340
354
|
- !ruby/object:Gem::Version
|
341
|
-
version: 4.
|
355
|
+
version: 4.6.1
|
356
|
+
type: :development
|
357
|
+
prerelease: false
|
358
|
+
version_requirements: !ruby/object:Gem::Requirement
|
359
|
+
requirements:
|
360
|
+
- - '='
|
361
|
+
- !ruby/object:Gem::Version
|
362
|
+
version: 4.6.1
|
363
|
+
- !ruby/object:Gem::Dependency
|
364
|
+
name: shoulda-matchers
|
365
|
+
requirement: !ruby/object:Gem::Requirement
|
366
|
+
requirements:
|
367
|
+
- - '='
|
368
|
+
- !ruby/object:Gem::Version
|
369
|
+
version: 4.3.0
|
342
370
|
type: :development
|
343
371
|
prerelease: false
|
344
372
|
version_requirements: !ruby/object:Gem::Requirement
|
345
373
|
requirements:
|
346
374
|
- - '='
|
347
375
|
- !ruby/object:Gem::Version
|
348
|
-
version: 4.
|
376
|
+
version: 4.3.0
|
349
377
|
- !ruby/object:Gem::Dependency
|
350
378
|
name: simplecov
|
351
379
|
requirement: !ruby/object:Gem::Requirement
|
@@ -380,14 +408,14 @@ dependencies:
|
|
380
408
|
requirements:
|
381
409
|
- - '='
|
382
410
|
- !ruby/object:Gem::Version
|
383
|
-
version: 0.9.
|
411
|
+
version: 0.9.26
|
384
412
|
type: :development
|
385
413
|
prerelease: false
|
386
414
|
version_requirements: !ruby/object:Gem::Requirement
|
387
415
|
requirements:
|
388
416
|
- - '='
|
389
417
|
- !ruby/object:Gem::Version
|
390
|
-
version: 0.9.
|
418
|
+
version: 0.9.26
|
391
419
|
- !ruby/object:Gem::Dependency
|
392
420
|
name: yardstick
|
393
421
|
requirement: !ruby/object:Gem::Requirement
|
@@ -431,6 +459,7 @@ files:
|
|
431
459
|
- lib/azeroth/decorator.rb
|
432
460
|
- lib/azeroth/decorator/hash_builder.rb
|
433
461
|
- lib/azeroth/decorator/key_value_extractor.rb
|
462
|
+
- lib/azeroth/decorator/method_builder.rb
|
434
463
|
- lib/azeroth/decorator/options.rb
|
435
464
|
- lib/azeroth/dummy_decorator.rb
|
436
465
|
- lib/azeroth/model.rb
|
@@ -452,6 +481,7 @@ files:
|
|
452
481
|
- spec/controllers/documents_controller_spec.rb
|
453
482
|
- spec/controllers/documents_with_error_controller_spec.rb
|
454
483
|
- spec/controllers/index_documents_controller_spec.rb
|
484
|
+
- spec/controllers/paginated_documents_controller_spec.rb
|
455
485
|
- spec/controllers/pokemon_masters_controller_spec.rb
|
456
486
|
- spec/controllers/pokemons_controller_spec.rb
|
457
487
|
- spec/dummy/.ruby-version
|
@@ -470,6 +500,7 @@ files:
|
|
470
500
|
- spec/dummy/app/controllers/documents_with_error_controller.rb
|
471
501
|
- spec/dummy/app/controllers/games_controller.rb
|
472
502
|
- spec/dummy/app/controllers/index_documents_controller.rb
|
503
|
+
- spec/dummy/app/controllers/paginated_documents_controller.rb
|
473
504
|
- spec/dummy/app/controllers/pokemon_masters_controller.rb
|
474
505
|
- spec/dummy/app/controllers/pokemons_controller.rb
|
475
506
|
- spec/dummy/app/controllers/publishers_controller.rb
|
@@ -554,6 +585,7 @@ files:
|
|
554
585
|
- spec/integration/yard/controllers/games_controller_spec.rb
|
555
586
|
- spec/lib/azeroth/decorator/hash_builder_spec.rb
|
556
587
|
- spec/lib/azeroth/decorator/key_value_extractor_spec.rb
|
588
|
+
- spec/lib/azeroth/decorator/method_builder_spec.rb
|
557
589
|
- spec/lib/azeroth/decorator_spec.rb
|
558
590
|
- spec/lib/azeroth/dummy_decorator_spec.rb
|
559
591
|
- spec/lib/azeroth/model_spec.rb
|
@@ -574,6 +606,7 @@ files:
|
|
574
606
|
- spec/support/app/controllers/request_handler_controller.rb
|
575
607
|
- spec/support/app/controllers/resource_builder_controller.rb
|
576
608
|
- spec/support/app/controllers/resource_route_builder_controller.rb
|
609
|
+
- spec/support/app/workers/worker.rb
|
577
610
|
- spec/support/factories/document.rb
|
578
611
|
- spec/support/factories/dummy_model.rb
|
579
612
|
- spec/support/factories/factory.rb
|
@@ -613,6 +646,7 @@ test_files:
|
|
613
646
|
- spec/controllers/documents_controller_spec.rb
|
614
647
|
- spec/controllers/documents_with_error_controller_spec.rb
|
615
648
|
- spec/controllers/index_documents_controller_spec.rb
|
649
|
+
- spec/controllers/paginated_documents_controller_spec.rb
|
616
650
|
- spec/controllers/pokemon_masters_controller_spec.rb
|
617
651
|
- spec/controllers/pokemons_controller_spec.rb
|
618
652
|
- spec/dummy/.ruby-version
|
@@ -631,6 +665,7 @@ test_files:
|
|
631
665
|
- spec/dummy/app/controllers/documents_with_error_controller.rb
|
632
666
|
- spec/dummy/app/controllers/games_controller.rb
|
633
667
|
- spec/dummy/app/controllers/index_documents_controller.rb
|
668
|
+
- spec/dummy/app/controllers/paginated_documents_controller.rb
|
634
669
|
- spec/dummy/app/controllers/pokemon_masters_controller.rb
|
635
670
|
- spec/dummy/app/controllers/pokemons_controller.rb
|
636
671
|
- spec/dummy/app/controllers/publishers_controller.rb
|
@@ -715,6 +750,7 @@ test_files:
|
|
715
750
|
- spec/integration/yard/controllers/games_controller_spec.rb
|
716
751
|
- spec/lib/azeroth/decorator/hash_builder_spec.rb
|
717
752
|
- spec/lib/azeroth/decorator/key_value_extractor_spec.rb
|
753
|
+
- spec/lib/azeroth/decorator/method_builder_spec.rb
|
718
754
|
- spec/lib/azeroth/decorator_spec.rb
|
719
755
|
- spec/lib/azeroth/dummy_decorator_spec.rb
|
720
756
|
- spec/lib/azeroth/model_spec.rb
|
@@ -735,6 +771,7 @@ test_files:
|
|
735
771
|
- spec/support/app/controllers/request_handler_controller.rb
|
736
772
|
- spec/support/app/controllers/resource_builder_controller.rb
|
737
773
|
- spec/support/app/controllers/resource_route_builder_controller.rb
|
774
|
+
- spec/support/app/workers/worker.rb
|
738
775
|
- spec/support/factories/document.rb
|
739
776
|
- spec/support/factories/dummy_model.rb
|
740
777
|
- spec/support/factories/factory.rb
|