azeroth 0.10.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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