azeroth 0.0.4 → 0.0.5

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 (39) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +10 -2
  3. data/.gitignore +8 -2
  4. data/.rubocop.yml +16 -0
  5. data/.rubocop_todo.yml +5 -24
  6. data/Dockerfile +26 -2
  7. data/Gemfile +2 -0
  8. data/README.md +2 -1
  9. data/Rakefile +1 -0
  10. data/azeroth.gemspec +20 -13
  11. data/config/check_specs.yml +5 -0
  12. data/config/rubycritc.rb +12 -0
  13. data/config/yardstick.yml +7 -2
  14. data/lib/azeroth.rb +6 -3
  15. data/lib/azeroth/model.rb +20 -1
  16. data/lib/azeroth/options.rb +12 -0
  17. data/lib/azeroth/resource_builder.rb +64 -6
  18. data/lib/azeroth/resource_route_builder.rb +112 -9
  19. data/lib/azeroth/resourceable.rb +5 -1
  20. data/lib/azeroth/resourceable/builder.rb +104 -9
  21. data/lib/azeroth/routes_builder.rb +54 -20
  22. data/lib/azeroth/version.rb +3 -1
  23. data/spec/lib/azeroth/model_spec.rb +7 -5
  24. data/spec/lib/azeroth/resource_builder_spec.rb +5 -3
  25. data/spec/lib/azeroth/resource_route_builder_spec.rb +6 -2
  26. data/spec/lib/azeroth/resourceable/builder_spec.rb +6 -1
  27. data/spec/lib/azeroth/routes_builder_spec.rb +14 -8
  28. data/spec/spec_helper.rb +5 -1
  29. data/spec/support/app/controllers/controller.rb +2 -0
  30. data/spec/support/app/controllers/resource_builder_controller.rb +2 -0
  31. data/spec/support/app/controllers/resource_route_builder_controller.rb +2 -0
  32. data/spec/support/app/controllers/routes_builder_controller.rb +2 -0
  33. data/spec/support/app/models/document.rb +2 -0
  34. data/spec/support/app/serializers/serializer.rb +2 -0
  35. data/spec/support/matchers/add_method.rb +6 -2
  36. data/spec/support/schema.rb +2 -0
  37. data/spec/support/shared_examples/resource_routes.rb +5 -3
  38. metadata +151 -51
  39. data/scripts/check_readme.sh +0 -6
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'active_support'
2
4
 
3
5
  module Azeroth
@@ -8,7 +10,9 @@ module Azeroth
8
10
 
9
11
  class_methods do
10
12
  def resource_for(name, **options)
11
- Builder.new(self, name, **options).build
13
+ Builder.new(
14
+ self, name, Azeroth::Options.new(options)
15
+ ).build
12
16
  end
13
17
  end
14
18
  end
@@ -1,15 +1,26 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'sinclair'
2
4
 
3
5
  module Azeroth
4
6
  module Resourceable
7
+ # @api private
8
+ # Builder responsible to add all methods to the controller
9
+ #
10
+ # Builder uses other builders to put together it's methods
11
+ #
12
+ # @see ResourceBuilder
13
+ # @see ResourceRouteBuilder
14
+ # @see RoutesBuilder
5
15
  class Builder
6
- attr_reader :clazz, :model
7
-
8
- delegate :build, :add_method, to: :builder
9
-
10
- def initialize(clazz, model_name, **_options)
16
+ # @param clazz [ActionController::Base] Controller to
17
+ # to be changed
18
+ # @param model_name [Symbol,String]
19
+ # @param options [Options]
20
+ def initialize(clazz, model_name, options)
11
21
  @clazz = clazz
12
22
  @model = Azeroth::Model.new(model_name)
23
+ @options = options
13
24
 
14
25
  add_params
15
26
  add_resource
@@ -19,29 +30,113 @@ module Azeroth
19
30
 
20
31
  private
21
32
 
33
+ attr_reader :clazz, :model, :options
34
+ # @method clazz
35
+ # @api private
36
+ # @private
37
+ #
38
+ # Controller to changed
39
+ #
40
+ # @return [ActionController::Base]
41
+
42
+ # @method model
43
+ # @api private
44
+ # @private
45
+ #
46
+ # Model interface to resource model
47
+ #
48
+ # @return [Model]
49
+
50
+ # @method options
51
+ # @api private
52
+ # @private
53
+ #
54
+ # Options
55
+ #
56
+ # @return [Options]
57
+
58
+ delegate :build, :add_method, to: :builder
59
+ # @method build
60
+ # @api private
61
+ # @private
62
+ #
63
+ # build all the methods
64
+ #
65
+ # @return [Array<Sinclair::MethodDefinition>]
66
+
67
+ # @method add_method
68
+ # @api private
69
+ #
70
+ # Add method to be built
71
+ #
72
+ # @return [Array<Sinclair::MethodDefinition>]
73
+
74
+ delegate :name, :klass, to: :model
75
+ # @method name
76
+ # @api private
77
+ # @private
78
+ #
79
+ # Resource name
80
+ #
81
+ # @return [Symbol,String]
82
+
83
+ # @method klass
84
+ # @api private
85
+ # @private
86
+ #
87
+ # Controller to be changed
88
+ #
89
+ # @return [Array<Sinclair::MethodDefinition>]
90
+
91
+ # @api private
92
+ # @private
93
+ #
94
+ # Returns a method builder
95
+ #
96
+ # @return [Sinclair]
97
+ #
98
+ # @see https://www.rubydoc.info/gems/sinclair Sinclair
22
99
  def builder
23
100
  @builder ||= Sinclair.new(clazz)
24
101
  end
25
102
 
103
+ # Add methods for id and parameters
104
+ #
105
+ # @return [Array<Sinclair::MethodDefinition>]
26
106
  def add_params
27
- add_method("#{model.name}_id", 'params.require(:id)')
28
- add_method("#{model.name}_params", "params.require(:#{model.name}).permit(:#{permitted_attributes.join(', :')})")
107
+ add_method("#{name}_id", 'params.require(:id)')
108
+ add_method(
109
+ "#{name}_params",
110
+ <<-CODE
111
+ params.require(:#{name})
112
+ .permit(:#{permitted_attributes.join(', :')})
113
+ CODE
114
+ )
29
115
  end
30
116
 
117
+ # Add methods for resource fetching
118
+ #
119
+ # @return [Array<Sinclair::MethodDefinition>]
31
120
  def add_resource
32
121
  ResourceBuilder.new(model, builder).append
33
122
  end
34
123
 
124
+ # Add the routes resource methods
125
+ #
126
+ # @return [Array<Sinclair::MethodDefinition>]
35
127
  def add_resource_for_routes
36
128
  ResourceRouteBuilder.new(model, builder).append
37
129
  end
38
130
 
131
+ # Add metohods for each route
132
+ #
133
+ # @return [Array<Sinclair::MethodDefinition>]
39
134
  def add_routes
40
- RoutesBuilder.new(model, builder).append
135
+ RoutesBuilder.new(model, builder, options).append
41
136
  end
42
137
 
43
138
  def permitted_attributes
44
- @permitted_attributes ||= model.klass.attribute_names - ['id']
139
+ @permitted_attributes ||= klass.attribute_names - ['id']
45
140
  end
46
141
  end
47
142
  end
@@ -1,35 +1,69 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Azeroth
4
+ # @api private
5
+ # @author Darthjee
6
+ #
7
+ # Builder resposible for adding routes methods to the controller
2
8
  class RoutesBuilder
3
- attr_reader :model, :builder
4
-
5
- delegate :add_method, to: :builder
6
-
7
- def initialize(model, builder)
9
+ # @param model [Model] resource interface
10
+ # @param builder [Sinclair] methods builder
11
+ # @param options [Option]
12
+ def initialize(model, builder, options)
8
13
  @model = model
9
14
  @builder = builder
15
+ @options = options
10
16
  end
11
17
 
18
+ # Append the routes methods to be built
19
+ #
20
+ # @return [Array<Sinclair::MethodDefinition>]
12
21
  def append
13
- %i[index show new edit create update destroy].each do |route|
14
- add_method(route, route_code[route].to_s)
22
+ %i[index show new edit create update].each do |route|
23
+ add_method(route, 'render_basic')
15
24
  end
25
+
26
+ add_method(:destroy, destroy_code)
16
27
  end
17
28
 
18
29
  private
19
30
 
20
- def route_code
21
- {
22
- index: :render_basic,
23
- show: :render_basic,
24
- new: :render_basic,
25
- edit: :render_basic,
26
- create: :render_basic,
27
- update: :render_basic,
28
- destroy: <<-RUBY
29
- #{model.name}.destroy
30
- head :no_content
31
- RUBY
32
- }
31
+ attr_reader :model, :builder
32
+ # @method model
33
+ # @api private
34
+ # @private
35
+ #
36
+ # Resource interface
37
+ #
38
+ # @return [Model]
39
+
40
+ # @method builder
41
+ # @api private
42
+ # @private
43
+ #
44
+ # Methods builder
45
+ #
46
+ # @return [Sinclair]
47
+
48
+ delegate :add_method, to: :builder
49
+ # @method add_method
50
+ # @api private
51
+ # @private
52
+ #
53
+ # Appends a method
54
+ #
55
+ # @return [Array<Sinclair::MethodDefinition>]
56
+
57
+ # @private
58
+ #
59
+ # Method code to destrou route
60
+ #
61
+ # @return [String]
62
+ def destroy_code
63
+ <<-RUBY
64
+ #{model.name}.destroy
65
+ head :no_content
66
+ RUBY
33
67
  end
34
68
  end
35
69
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Azeroth
2
- VERSION = '0.0.4'.freeze
4
+ VERSION = '0.0.5'
3
5
  end
@@ -1,29 +1,31 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  shared_examples 'a model wrapper' do
4
6
  describe '#name' do
5
7
  it 'returns the model name' do
6
- expect(subject.name).to eq('document')
8
+ expect(model.name).to eq('document')
7
9
  end
8
10
  end
9
11
 
10
12
  describe '#plural' do
11
13
  it 'returns the model name pluralized' do
12
- expect(subject.plural).to eq('documents')
14
+ expect(model.plural).to eq('documents')
13
15
  end
14
16
  end
15
17
 
16
18
  describe '#klass' do
17
19
  it 'returns the class of the model' do
18
- expect(subject.klass).to eq(Document)
20
+ expect(model.klass).to eq(Document)
19
21
  end
20
22
  end
21
23
  end
22
24
 
23
25
  describe Azeroth::Model do
24
- subject { described_class.new(input) }
26
+ subject(:model) { described_class.new(input) }
25
27
 
26
- context 'when initializing with simbol' do
28
+ context 'when initializing with symbol' do
27
29
  let(:input) { :document }
28
30
 
29
31
  it_behaves_like 'a model wrapper'
@@ -1,14 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Azeroth::ResourceBuilder do
4
- subject { described_class.new(model, builder) }
6
+ subject(:resource_builder) { described_class.new(model, builder) }
5
7
 
6
8
  let(:model) { Azeroth::Model.new(:document) }
7
9
  let(:builder) { Sinclair.new(klass) }
8
10
  let(:klass) { Class.new(ResourceBuilderController) }
9
11
 
10
12
  before do
11
- subject.append
13
+ resource_builder.append
12
14
  10.times { Document.create }
13
15
  end
14
16
 
@@ -25,7 +27,7 @@ describe Azeroth::ResourceBuilder do
25
27
  .to(true)
26
28
  end
27
29
 
28
- context 'after the build' do
30
+ describe 'after the build' do
29
31
  let(:controller) { klass.new(document_id: document.id) }
30
32
  let(:document) { Document.create }
31
33
 
@@ -1,14 +1,18 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Azeroth::ResourceRouteBuilder do
4
- subject { described_class.new(model, builder) }
6
+ subject(:resource_routes_builder) do
7
+ described_class.new(model, builder)
8
+ end
5
9
 
6
10
  let(:model) { Azeroth::Model.new(:document) }
7
11
  let(:builder) { Sinclair.new(klass) }
8
12
  let(:klass) { Class.new(ResourceRouteBuilderController) }
9
13
 
10
14
  before do
11
- subject.append
15
+ resource_routes_builder.append
12
16
  10.times { Document.create }
13
17
  end
14
18
 
@@ -1,7 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Azeroth::Resourceable::Builder do
4
- subject { described_class.new(klass, :document) }
6
+ subject { described_class.new(klass, :document, options) }
7
+
8
+ let(:options) { Azeroth::Options.new(options_hash) }
9
+ let(:options_hash) { {} }
5
10
 
6
11
  let(:klass) do
7
12
  Class.new(Controller) do
@@ -1,21 +1,27 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Azeroth::RoutesBuilder do
4
- subject { described_class.new(model, builder) }
6
+ subject(:routes_builder) do
7
+ described_class.new(model, builder, options)
8
+ end
5
9
 
6
- let(:model) { Azeroth::Model.new(:document) }
7
- let(:builder) { Sinclair.new(klass) }
8
- let(:klass) { Class.new(RoutesBuilderController) }
9
- let(:instance) { klass.new(params) }
10
- let(:params) { {} }
10
+ let(:model) { Azeroth::Model.new(:document) }
11
+ let(:builder) { Sinclair.new(klass) }
12
+ let(:klass) { Class.new(RoutesBuilderController) }
13
+ let(:instance) { klass.new(params) }
14
+ let(:params) { {} }
15
+ let(:options) { Azeroth::Options.new(options_hash) }
16
+ let(:options_hash) { {} }
11
17
 
12
18
  before do
13
- subject.append
19
+ routes_builder.append
14
20
  10.times { Document.create }
15
21
  end
16
22
 
17
23
  describe '#append' do
18
- before { subject.append }
24
+ before { routes_builder.append }
19
25
 
20
26
  it 'adds index route' do
21
27
  expect do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'simplecov'
2
4
  SimpleCov.start do
3
5
  add_filter '/spec/'
@@ -7,7 +9,9 @@ require 'pry-nav'
7
9
  require 'azeroth'
8
10
 
9
11
  require 'active_record'
10
- ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
12
+ ActiveRecord::Base.establish_connection(
13
+ adapter: 'sqlite3', database: ':memory:'
14
+ )
11
15
 
12
16
  support_files = File.expand_path('spec/support/**/*.rb')
13
17
  Dir[support_files].each { |file| require file }
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'action_controller'
2
4
 
3
5
  class Controller
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ResourceBuilderController
2
4
  def initialize(document_id: nil)
3
5
  @document_id = document_id
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ResourceRouteBuilderController
2
4
  def initialize(id: nil, document: nil)
3
5
  @id = id
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class RoutesBuilderController
2
4
  def initialize(id: nil, document: nil)
3
5
  @id = id
@@ -1,2 +1,4 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Document < ActiveRecord::Base
2
4
  end