azeroth 0.10.1 → 1.1.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.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +3 -3
  3. data/Dockerfile +1 -1
  4. data/README.md +43 -30
  5. data/azeroth.gemspec +8 -7
  6. data/config/check_specs.yml +1 -0
  7. data/lib/azeroth/decorator/class_methods.rb +249 -0
  8. data/lib/azeroth/decorator/hash_builder.rb +3 -1
  9. data/lib/azeroth/decorator/key_value_extractor.rb +3 -8
  10. data/lib/azeroth/decorator/method_builder.rb +23 -7
  11. data/lib/azeroth/decorator/options.rb +3 -1
  12. data/lib/azeroth/decorator.rb +30 -188
  13. data/lib/azeroth/params_builder.rb +11 -8
  14. data/lib/azeroth/request_handler/index.rb +7 -33
  15. data/lib/azeroth/request_handler/pagination.rb +53 -0
  16. data/lib/azeroth/request_handler.rb +8 -7
  17. data/lib/azeroth/resource_builder.rb +9 -10
  18. data/lib/azeroth/resourceable/builder.rb +15 -11
  19. data/lib/azeroth/routes_builder.rb +8 -10
  20. data/lib/azeroth/version.rb +1 -1
  21. data/spec/controllers/documents_with_error_controller_spec.rb +3 -1
  22. data/spec/dummy/app/models/website/decorator.rb +11 -0
  23. data/spec/dummy/app/models/website/with_location.rb +21 -0
  24. data/spec/dummy/app/models/website.rb +4 -0
  25. data/spec/dummy/config/environments/development.rb +1 -0
  26. data/spec/dummy/db/schema.rb +5 -1
  27. data/spec/integration/yard/azeroth/decorator_spec.rb +15 -0
  28. data/spec/lib/azeroth/decorator/key_value_extractor_spec.rb +3 -1
  29. data/spec/lib/azeroth/decorator/method_builder_spec.rb +61 -2
  30. data/spec/lib/azeroth/decorator_spec.rb +96 -3
  31. data/spec/lib/azeroth/params_builder_spec.rb +3 -1
  32. data/spec/lib/azeroth/request_handler/pagination_spec.rb +133 -0
  33. data/spec/lib/azeroth/resource_builder_spec.rb +3 -1
  34. data/spec/lib/azeroth/routes_builder_spec.rb +3 -1
  35. metadata +41 -17
@@ -3,21 +3,80 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Azeroth::Decorator::MethodBuilder do
6
+ subject(:build_reader) do
7
+ described_class.build_reader(decorator_class, :age, options)
8
+ end
9
+
6
10
  let(:decorator_class) { Class.new(Azeroth::Decorator) }
7
11
  let(:decorator) { decorator_class.new(object) }
8
12
  let(:model) { build(:dummy_model) }
9
13
  let(:object) { model }
14
+ let(:options) { Azeroth::Decorator::Options.new(options_hash) }
15
+ let(:options_hash) { {} }
10
16
 
11
17
  describe '.build_reader' do
12
18
  it do
13
- expect { described_class.build_reader(decorator_class, :age) }
19
+ expect { build_reader }
14
20
  .to add_method(:age).to(decorator)
15
21
  end
16
22
 
17
23
  it do
18
- described_class.build_reader(decorator_class, :age)
24
+ build_reader
19
25
 
20
26
  expect(decorator.age).to eq(model.age)
21
27
  end
28
+
29
+ context 'when passing reader option' do
30
+ context 'when passing true' do
31
+ let(:options_hash) { { reader: true } }
32
+
33
+ it do
34
+ expect { build_reader }
35
+ .to add_method(:age).to(decorator)
36
+ end
37
+ end
38
+
39
+ context 'when passing false' do
40
+ let(:options_hash) { { reader: false } }
41
+
42
+ it do
43
+ expect { build_reader }
44
+ .not_to add_method(:age).to(decorator)
45
+ end
46
+ end
47
+ end
48
+
49
+ context 'when passing override option as true' do
50
+ let(:options_hash) { { override: false } }
51
+
52
+ it do
53
+ expect { build_reader }
54
+ .to add_method(:age).to(decorator)
55
+ end
56
+ end
57
+
58
+ context 'when method already existed' do
59
+ before do
60
+ decorator_class.define_method(:age) { 1 }
61
+ end
62
+
63
+ context 'when passing override option as true' do
64
+ let(:options_hash) { { override: true } }
65
+
66
+ it do
67
+ expect { build_reader }
68
+ .to change_method(:age).on(decorator)
69
+ end
70
+ end
71
+
72
+ context 'when passing override option as false' do
73
+ let(:options_hash) { { override: false } }
74
+
75
+ it do
76
+ expect { build_reader }
77
+ .not_to change_method(:age).on(decorator)
78
+ end
79
+ end
80
+ end
22
81
  end
23
82
  end
@@ -5,14 +5,16 @@ require 'spec_helper'
5
5
  describe Azeroth::Decorator do
6
6
  subject(:decorator) { DummyModel::Decorator.new(object) }
7
7
 
8
- let(:model) { build(:dummy_model) }
9
- let(:object) { model }
8
+ let(:model) { build(:dummy_model) }
9
+ let(:object) { model }
10
+ let(:instance) { decorator.new(object) }
10
11
 
11
12
  describe '.expose' do
12
13
  subject(:decorator) { Class.new(described_class) }
13
14
 
15
+ let(:options_hash) { {} }
14
16
  let(:expected_options) do
15
- Azeroth::Decorator::Options.new
17
+ Azeroth::Decorator::Options.new(options_hash)
16
18
  end
17
19
 
18
20
  it do
@@ -59,6 +61,97 @@ describe Azeroth::Decorator do
59
61
  .and raise_error(Sinclair::Exception::InvalidOptions)
60
62
  end
61
63
  end
64
+
65
+ context 'when decorator already has the method' do
66
+ before do
67
+ decorator.define_method(:name) do
68
+ 'some name'
69
+ end
70
+ end
71
+
72
+ context 'when not passing override' do
73
+ it do
74
+ expect { decorator.send(:expose, :name) }
75
+ .to change(decorator, :attributes_map)
76
+ .from({})
77
+ .to({ name: expected_options })
78
+ end
79
+
80
+ it do
81
+ expect { decorator.send(:expose, :name) }
82
+ .to change_method(:name)
83
+ .on(instance)
84
+ end
85
+ end
86
+
87
+ context 'when passing override as true' do
88
+ let(:options_hash) { { override: true } }
89
+
90
+ it do
91
+ expect { decorator.send(:expose, :name, **options_hash) }
92
+ .to change(decorator, :attributes_map)
93
+ .from({})
94
+ .to({ name: expected_options })
95
+ end
96
+
97
+ it do
98
+ expect { decorator.send(:expose, :name, **options_hash) }
99
+ .to change_method(:name)
100
+ .on(instance)
101
+ end
102
+ end
103
+
104
+ context 'when passing override as false' do
105
+ let(:options_hash) { { override: false } }
106
+
107
+ it do
108
+ expect { decorator.send(:expose, :name, **options_hash) }
109
+ .to change(decorator, :attributes_map)
110
+ .from({})
111
+ .to({ name: expected_options })
112
+ end
113
+
114
+ it do
115
+ expect { decorator.send(:expose, :name, **options_hash) }
116
+ .not_to change_method(:name)
117
+ .on(instance)
118
+ end
119
+ end
120
+ end
121
+
122
+ context 'when passing reader option' do
123
+ context 'when option is true' do
124
+ let(:options_hash) { { reader: true } }
125
+
126
+ it do
127
+ expect { decorator.send(:expose, :name, **options_hash) }
128
+ .to change(decorator, :attributes_map)
129
+ .from({})
130
+ .to({ name: expected_options })
131
+ end
132
+
133
+ it do
134
+ expect { decorator.send(:expose, :name, **options_hash) }
135
+ .to add_method(:name).to(decorator)
136
+ end
137
+ end
138
+
139
+ context 'when option is false' do
140
+ let(:options_hash) { { reader: false } }
141
+
142
+ it do
143
+ expect { decorator.send(:expose, :name, **options_hash) }
144
+ .to change(decorator, :attributes_map)
145
+ .from({})
146
+ .to({ name: expected_options })
147
+ end
148
+
149
+ it do
150
+ expect { decorator.send(:expose, :name, **options_hash) }
151
+ .not_to add_method(:name).to(decorator)
152
+ end
153
+ end
154
+ end
62
155
  end
63
156
 
64
157
  describe '#as_json' do
@@ -3,7 +3,9 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Azeroth::ParamsBuilder do
6
- subject(:params_builder) { described_class.new(model, builder) }
6
+ subject(:params_builder) do
7
+ described_class.new(model: model, builder: builder)
8
+ end
7
9
 
8
10
  let(:model) { Azeroth::Model.new(:document, options) }
9
11
  let(:options) { Azeroth::Options.new }
@@ -0,0 +1,133 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Azeroth::RequestHandler::Pagination do
6
+ subject(:pagination) { described_class.new(params, options) }
7
+
8
+ let(:options) { Azeroth::Options.new(options_hash) }
9
+ let(:options_hash) { {} }
10
+ let(:params) { ActionController::Parameters.new(parameters) }
11
+ let(:parameters) { {} }
12
+
13
+ describe '#offset' do
14
+ context 'when nothing was defined' do
15
+ it do
16
+ expect(pagination.offset).to be_zero
17
+ end
18
+ end
19
+
20
+ context 'when parameters has page value' do
21
+ let(:parameters) { { page: page } }
22
+ let(:page) { Random.rand(1..10) }
23
+ let(:expected_offset) { (page - 1) * expected_per_page }
24
+ let(:expected_per_page) { 20 }
25
+
26
+ it 'returns value from request using default per_page' do
27
+ expect(pagination.offset).to eq(expected_offset)
28
+ end
29
+ end
30
+
31
+ context 'when parameters has per_page value' do
32
+ let(:parameters) { { per_page: per_page } }
33
+ let(:per_page) { Random.rand(1..10) }
34
+
35
+ it do
36
+ expect(pagination.offset).to be_zero
37
+ end
38
+ end
39
+
40
+ context 'when parameters has page and per page values' do
41
+ let(:parameters) { { page: page, per_page: per_page } }
42
+ let(:page) { Random.rand(1..10) }
43
+ let(:per_page) { Random.rand(1..10) }
44
+ let(:expected_offset) { (page - 1) * expected_per_page }
45
+ let(:expected_per_page) { per_page }
46
+
47
+ it 'returns value from request' do
48
+ expect(pagination.offset).to eq(expected_offset)
49
+ end
50
+ end
51
+
52
+ context 'when parameters has page and options per page values' do
53
+ let(:parameters) { { page: page } }
54
+ let(:options_hash) { { per_page: per_page } }
55
+ let(:page) { Random.rand(1..10) }
56
+ let(:per_page) { Random.rand(1..10) }
57
+ let(:expected_offset) { (page - 1) * expected_per_page }
58
+ let(:expected_per_page) { per_page }
59
+
60
+ it 'returns value from request and options' do
61
+ expect(pagination.offset).to eq(expected_offset)
62
+ end
63
+ end
64
+
65
+ context 'when params has page and per_page and options per page values' do
66
+ let(:parameters) { { page: page, per_page: per_page } }
67
+ let(:options_hash) { { per_page: options_per_page } }
68
+ let(:page) { Random.rand(1..10) }
69
+ let(:options_per_page) { Random.rand(1..10) }
70
+ let(:per_page) { Random.rand(1..10) }
71
+ let(:expected_offset) { (page - 1) * expected_per_page }
72
+ let(:expected_per_page) { per_page }
73
+
74
+ it 'returns value from request' do
75
+ expect(pagination.offset).to eq(expected_offset)
76
+ end
77
+ end
78
+ end
79
+
80
+ describe '#limit' do
81
+ context 'when nothing was defined' do
82
+ it 'returns default value' do
83
+ expect(pagination.limit).to eq(20)
84
+ end
85
+ end
86
+
87
+ context 'when parameters has per_page' do
88
+ let(:parameters) { { per_page: per_page } }
89
+ let(:per_page) { Random.rand(1..10) }
90
+
91
+ it 'returns value from request' do
92
+ expect(pagination.limit).to eq(per_page)
93
+ end
94
+ end
95
+
96
+ context 'when options has per_page' do
97
+ let(:options_hash) { { per_page: per_page } }
98
+ let(:per_page) { Random.rand(1..10) }
99
+
100
+ it 'returns value from options' do
101
+ expect(pagination.limit).to eq(per_page)
102
+ end
103
+ end
104
+
105
+ context 'when params and options have per_page' do
106
+ let(:parameters) { { per_page: per_page } }
107
+ let(:per_page) { Random.rand(1..10) }
108
+ let(:options_hash) { { per_page: options_per_page } }
109
+ let(:options_per_page) { Random.rand(1..10) }
110
+
111
+ it 'returns value from request' do
112
+ expect(pagination.limit).to eq(per_page)
113
+ end
114
+ end
115
+ end
116
+
117
+ describe '#current_page' do
118
+ context 'when nothing was defined' do
119
+ it 'returns first page' do
120
+ expect(pagination.current_page).to eq(1)
121
+ end
122
+ end
123
+
124
+ context 'when parameters has page' do
125
+ let(:parameters) { { page: page } }
126
+ let(:page) { Random.rand(1..10) }
127
+
128
+ it 'returns value from request' do
129
+ expect(pagination.current_page).to eq(page)
130
+ end
131
+ end
132
+ end
133
+ end
@@ -3,7 +3,9 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Azeroth::ResourceBuilder do
6
- subject(:resource_builder) { described_class.new(model, builder) }
6
+ subject(:resource_builder) do
7
+ described_class.new(model: model, builder: builder)
8
+ end
7
9
 
8
10
  let(:model) { Azeroth::Model.new(:document, options) }
9
11
  let(:options) { Azeroth::Options.new }
@@ -4,7 +4,9 @@ require 'spec_helper'
4
4
 
5
5
  describe Azeroth::RoutesBuilder do
6
6
  subject(:routes_builder) do
7
- described_class.new(model, builder, options)
7
+ described_class.new(
8
+ model: model, builder: builder, options: options
9
+ )
8
10
  end
9
11
 
10
12
  let(:controller) { controller_class.new }
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.10.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Darthjee
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-08-27 00:00:00.000000000 Z
11
+ date: 2024-05-21 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.x
19
+ version: 7.0.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.x
26
+ version: 7.0.x
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: darthjee-active_ext
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -58,56 +58,56 @@ dependencies:
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: 1.6.7
61
+ version: 2.0.0
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.7
68
+ version: 2.0.0
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.8.1
75
+ version: 7.0.4.3
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.8.1
82
+ version: 7.0.4.3
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.8.1
89
+ version: 7.0.4.3
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.8.1
96
+ version: 7.0.4.3
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: bundler
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 2.3.14
103
+ version: 2.4.8
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 2.3.14
110
+ version: 2.4.8
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: factory_bot
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -142,14 +142,14 @@ dependencies:
142
142
  requirements:
143
143
  - - '='
144
144
  - !ruby/object:Gem::Version
145
- version: 1.13.6
145
+ version: 1.13.8
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - '='
151
151
  - !ruby/object:Gem::Version
152
- version: 1.13.6
152
+ version: 1.13.8
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: pry
155
155
  requirement: !ruby/object:Gem::Requirement
@@ -184,14 +184,14 @@ dependencies:
184
184
  requirements:
185
185
  - - '='
186
186
  - !ruby/object:Gem::Version
187
- version: 5.2.8.1
187
+ version: 7.0.4.3
188
188
  type: :development
189
189
  prerelease: false
190
190
  version_requirements: !ruby/object:Gem::Requirement
191
191
  requirements:
192
192
  - - '='
193
193
  - !ruby/object:Gem::Version
194
- version: 5.2.8.1
194
+ version: 7.0.4.3
195
195
  - !ruby/object:Gem::Dependency
196
196
  name: rails-controller-testing
197
197
  requirement: !ruby/object:Gem::Requirement
@@ -402,6 +402,20 @@ dependencies:
402
402
  - - '='
403
403
  - !ruby/object:Gem::Version
404
404
  version: 0.21.2
405
+ - !ruby/object:Gem::Dependency
406
+ name: sprockets-rails
407
+ requirement: !ruby/object:Gem::Requirement
408
+ requirements:
409
+ - - '='
410
+ - !ruby/object:Gem::Version
411
+ version: 3.4.2
412
+ type: :development
413
+ prerelease: false
414
+ version_requirements: !ruby/object:Gem::Requirement
415
+ requirements:
416
+ - - '='
417
+ - !ruby/object:Gem::Version
418
+ version: 3.4.2
405
419
  - !ruby/object:Gem::Dependency
406
420
  name: sqlite3
407
421
  requirement: !ruby/object:Gem::Requirement
@@ -486,6 +500,7 @@ files:
486
500
  - lib/azeroth.rb
487
501
  - lib/azeroth/controller_interface.rb
488
502
  - lib/azeroth/decorator.rb
503
+ - lib/azeroth/decorator/class_methods.rb
489
504
  - lib/azeroth/decorator/hash_builder.rb
490
505
  - lib/azeroth/decorator/key_value_extractor.rb
491
506
  - lib/azeroth/decorator/method_builder.rb
@@ -500,6 +515,7 @@ files:
500
515
  - lib/azeroth/request_handler/edit.rb
501
516
  - lib/azeroth/request_handler/index.rb
502
517
  - lib/azeroth/request_handler/new.rb
518
+ - lib/azeroth/request_handler/pagination.rb
503
519
  - lib/azeroth/request_handler/show.rb
504
520
  - lib/azeroth/request_handler/update.rb
505
521
  - lib/azeroth/resource_builder.rb
@@ -564,6 +580,9 @@ files:
564
580
  - spec/dummy/app/models/product/decorator_with_factory.rb
565
581
  - spec/dummy/app/models/publisher.rb
566
582
  - spec/dummy/app/models/user.rb
583
+ - spec/dummy/app/models/website.rb
584
+ - spec/dummy/app/models/website/decorator.rb
585
+ - spec/dummy/app/models/website/with_location.rb
567
586
  - spec/dummy/app/views/documents/edit.html
568
587
  - spec/dummy/app/views/documents/index.html
569
588
  - spec/dummy/app/views/documents/new.html
@@ -634,6 +653,7 @@ files:
634
653
  - spec/lib/azeroth/request_handler/edit_spec.rb
635
654
  - spec/lib/azeroth/request_handler/index_spec.rb
636
655
  - spec/lib/azeroth/request_handler/new_spec.rb
656
+ - spec/lib/azeroth/request_handler/pagination_spec.rb
637
657
  - spec/lib/azeroth/request_handler/show_spec.rb
638
658
  - spec/lib/azeroth/request_handler/update_spec.rb
639
659
  - spec/lib/azeroth/request_handler_spec.rb
@@ -679,7 +699,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
679
699
  - !ruby/object:Gem::Version
680
700
  version: '0'
681
701
  requirements: []
682
- rubygems_version: 3.3.20
702
+ rubygems_version: 3.1.2
683
703
  signing_key:
684
704
  specification_version: 4
685
705
  summary: Azeroth
@@ -740,6 +760,9 @@ test_files:
740
760
  - spec/dummy/app/models/product/decorator_with_factory.rb
741
761
  - spec/dummy/app/models/publisher.rb
742
762
  - spec/dummy/app/models/user.rb
763
+ - spec/dummy/app/models/website.rb
764
+ - spec/dummy/app/models/website/decorator.rb
765
+ - spec/dummy/app/models/website/with_location.rb
743
766
  - spec/dummy/app/views/documents/edit.html
744
767
  - spec/dummy/app/views/documents/index.html
745
768
  - spec/dummy/app/views/documents/new.html
@@ -810,6 +833,7 @@ test_files:
810
833
  - spec/lib/azeroth/request_handler/edit_spec.rb
811
834
  - spec/lib/azeroth/request_handler/index_spec.rb
812
835
  - spec/lib/azeroth/request_handler/new_spec.rb
836
+ - spec/lib/azeroth/request_handler/pagination_spec.rb
813
837
  - spec/lib/azeroth/request_handler/show_spec.rb
814
838
  - spec/lib/azeroth/request_handler/update_spec.rb
815
839
  - spec/lib/azeroth/request_handler_spec.rb