azeroth 0.10.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +3 -3
  3. data/Dockerfile +6 -9
  4. data/README.md +31 -1
  5. data/azeroth.gemspec +12 -11
  6. data/config/yardstick.yml +1 -0
  7. data/docker-compose.yml +0 -8
  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/options.rb +24 -12
  11. data/lib/azeroth/params_builder.rb +83 -0
  12. data/lib/azeroth/request_handler/update.rb +3 -1
  13. data/lib/azeroth/request_handler.rb +1 -2
  14. data/lib/azeroth/resource_builder.rb +9 -10
  15. data/lib/azeroth/resourceable/builder.rb +16 -34
  16. data/lib/azeroth/resourceable/class_methods.rb +1 -130
  17. data/lib/azeroth/resourceable.rb +171 -4
  18. data/lib/azeroth/routes_builder.rb +8 -10
  19. data/lib/azeroth/version.rb +1 -1
  20. data/lib/azeroth.rb +1 -0
  21. data/spec/controllers/documents_with_error_controller_spec.rb +3 -1
  22. data/spec/dummy/app/models/movie/simple_decorator.rb +7 -0
  23. data/spec/dummy/app/models/movie.rb +5 -0
  24. data/spec/dummy/config/environments/development.rb +1 -0
  25. data/spec/dummy/db/schema.rb +4 -1
  26. data/spec/integration/yard/controllers/paginated_documents_controller_spec.rb +33 -0
  27. data/spec/lib/azeroth/decorator/key_value_extractor_spec.rb +3 -1
  28. data/spec/lib/azeroth/params_builder_spec.rb +58 -0
  29. data/spec/lib/azeroth/resource_builder_spec.rb +3 -1
  30. data/spec/lib/azeroth/resourceable_spec.rb +108 -0
  31. data/spec/lib/azeroth/routes_builder_spec.rb +3 -1
  32. data/spec/support/app/controllers/controller.rb +1 -1
  33. data/spec/support/app/controllers/params_builder_controller.rb +14 -0
  34. data/spec/support/factories/movie.rb +8 -0
  35. metadata +62 -34
  36. data/Dockerfile.circleci +0 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b05d8bcf76fadc6b48d87c98c5523a21e5cdb68857d0ba42d99e5e2b1c3ec41b
4
- data.tar.gz: f3e65b23e171f6c63ae143bb2a47aa7100a11ee29fdde85dd7938d5ba2a62408
3
+ metadata.gz: 72a4e7c837a4053e850b9479d42cfccd2e279ac028f57da2c5d3baed6c6babfa
4
+ data.tar.gz: 84591492fc859555d87b86704a61e68c0b8171e42a8fd77d1f4e502216516fc0
5
5
  SHA512:
6
- metadata.gz: 1807ceb2a7450f2d469d9232d3c3fb36ebcb7b8942b1309a7ba8686a30bebc1074598b649820d94553be4917ce15aeb2b0a919b7f2eb1a4e361bd159a50751fa
7
- data.tar.gz: 76992063fb6218ef13ebbf38416b8165b7f79bb69bb1f56330dc0c5d66cb8186394509e8b52fa7aa4c3d6f950db031692139f315cd126aa2c44b1c57ab511894
6
+ metadata.gz: ad6ca16b03b7b99b051bf9bfd25e25d1d522fa89e5b5ff31e495fa1af4fbb193dd269b062d8a87205aa8eeea84bd8a405b84de5d1663d7a1636239d4dd6b973f
7
+ data.tar.gz: 3eec0d1c24bb260dab5fb3ccccf5deedc8ae2eeff7378084fd501c82e740f776f1e3a14e32cee939155f5f833c4c1affdd3ca19f6636681f664be3deca36ed23
data/.circleci/config.yml CHANGED
@@ -22,7 +22,7 @@ workflows:
22
22
  jobs:
23
23
  test:
24
24
  docker:
25
- - image: darthjee/circleci_rails_gems:1.0.0
25
+ - image: darthjee/circleci_rails_gems:1.2.0
26
26
  environment:
27
27
  PROJECT: azeroth
28
28
  steps:
@@ -41,7 +41,7 @@ jobs:
41
41
  command: cc-test-reporter after-build --exit-code $?
42
42
  checks:
43
43
  docker:
44
- - image: darthjee/circleci_rails_gems:1.0.0
44
+ - image: darthjee/circleci_rails_gems:1.2.0
45
45
  environment:
46
46
  PROJECT: azeroth
47
47
  steps:
@@ -66,7 +66,7 @@ jobs:
66
66
  command: check_specs
67
67
  build-and-release:
68
68
  docker:
69
- - image: darthjee/circleci_rails_gems:1.0.0
69
+ - image: darthjee/circleci_rails_gems:1.2.0
70
70
  environment:
71
71
  PROJECT: azeroth
72
72
  steps:
data/Dockerfile CHANGED
@@ -1,12 +1,14 @@
1
- FROM darthjee/rails_gems:1.0.0 as base
2
- FROM darthjee/scripts:0.1.8 as scripts
1
+ FROM darthjee/scripts:0.3.1 as scripts
2
+
3
+ FROM darthjee/rails_gems:1.2.0 as base
4
+
5
+ COPY --chown=app:app ./ /home/app/app/
3
6
 
4
7
  ######################################
5
8
 
6
9
  FROM base as builder
7
10
 
8
- COPY --chown=app ./ /home/app/app/
9
- COPY --chown=app:app --from=scripts /home/scripts/builder/bundle_builder.sh /usr/local/sbin/
11
+ COPY --chown=app:app --from=scripts /home/scripts/builder/bundle_builder.sh /usr/local/sbin/bundle_builder.sh
10
12
 
11
13
  ENV HOME_DIR /home/app
12
14
  RUN bundle_builder.sh
@@ -14,11 +16,6 @@ RUN bundle_builder.sh
14
16
  #######################
15
17
  #FINAL IMAGE
16
18
  FROM base
17
- RUN mkdir lib/azeroth -p
18
19
 
19
20
  COPY --chown=app:app --from=builder /home/app/bundle/ /usr/local/bundle/
20
-
21
- COPY --chown=app ./*.gemspec ./Gemfile /home/app/app/
22
- COPY --chown=app ./lib/azeroth/version.rb /home/app/app/lib/azeroth/
23
-
24
21
  RUN bundle install
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.10.0](https://www.rubydoc.info/gems/azeroth/0.10.0)
14
+ [https://www.rubydoc.info/gems/azeroth/1.0.0](https://www.rubydoc.info/gems/azeroth/1.0.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
@@ -131,6 +131,36 @@ It accepts options
131
131
  end
132
132
  ```
133
133
 
134
+ ```ruby
135
+ class PaginatedDocumentsController < ApplicationController
136
+ include Azeroth::Resourceable
137
+
138
+ resource_for :document, only: 'index', paginated: true
139
+ end
140
+
141
+ 30.times { create(:document) }
142
+
143
+ get '/paginated_documents.json'
144
+
145
+ # returns Array with 20 first documents
146
+ # returns in the headers pagination headers
147
+ # {
148
+ # 'pages' => 2,
149
+ # 'per_page' => 20,
150
+ # 'page' => 1
151
+ # }
152
+
153
+ get '/paginated_documents.json?page=2'
154
+
155
+ # returns Array with 10 next documents
156
+ # returns in the headers pagination headers
157
+ # {
158
+ # 'pages' => 2,
159
+ # 'per_page' => 20,
160
+ # 'page' => 2
161
+ # }
162
+ ```
163
+
134
164
  ## Azeroth::Decorator
135
165
 
136
166
  [Decorators](https://www.rubydoc.info/gems/azeroth/Azeroth/Decorator) are
data/azeroth.gemspec CHANGED
@@ -18,21 +18,21 @@ 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.x'
21
+ gem.add_runtime_dependency 'activesupport', '~> 7.0.x'
22
22
  gem.add_runtime_dependency 'darthjee-active_ext', '>= 1.3.2'
23
- gem.add_runtime_dependency 'jace', '>= 0.0.3'
24
- gem.add_runtime_dependency 'sinclair', '>= 1.6.7'
23
+ gem.add_runtime_dependency 'jace', '>= 0.1.1'
24
+ gem.add_runtime_dependency 'sinclair', '>= 2.0.0'
25
25
 
26
- gem.add_development_dependency 'actionpack', '~> 5.2.x'
27
- gem.add_development_dependency 'activerecord', '~> 5.2.x'
28
- gem.add_development_dependency 'bundler', '~> 2.3.14'
26
+ gem.add_development_dependency 'actionpack', '7.0.4.3'
27
+ gem.add_development_dependency 'activerecord', '7.0.4.3'
28
+ gem.add_development_dependency 'bundler', '~> 2.4.8'
29
29
  gem.add_development_dependency 'factory_bot', '6.2.1'
30
- gem.add_development_dependency 'minitest', '~> 5.15.0'
31
- gem.add_development_dependency 'nokogiri', '1.13.6'
30
+ gem.add_development_dependency 'minitest', '5.16.2'
31
+ gem.add_development_dependency 'nokogiri', '1.13.8'
32
32
  gem.add_development_dependency 'pry', '0.14.1'
33
33
  gem.add_development_dependency 'pry-nav', '1.0.0'
34
- gem.add_development_dependency 'rails', '~> 5.2.x'
35
- gem.add_development_dependency 'rails-controller-testing', '1.0.4'
34
+ gem.add_development_dependency 'rails', '7.0.4.3'
35
+ gem.add_development_dependency 'rails-controller-testing', '1.0.5'
36
36
  gem.add_development_dependency 'rake', '13.0.6'
37
37
  gem.add_development_dependency 'reek', '6.0.3'
38
38
  gem.add_development_dependency 'rspec', '3.11.0'
@@ -44,9 +44,10 @@ Gem::Specification.new do |gem|
44
44
  gem.add_development_dependency 'rspec-support', '3.11.0'
45
45
  gem.add_development_dependency 'rubocop', '0.80.1'
46
46
  gem.add_development_dependency 'rubocop-rspec', '1.38.1'
47
- gem.add_development_dependency 'rubycritic', '4.6.1'
47
+ gem.add_development_dependency 'rubycritic', '4.7.0'
48
48
  gem.add_development_dependency 'shoulda-matchers', '4.3.0'
49
49
  gem.add_development_dependency 'simplecov', '0.21.2'
50
+ gem.add_development_dependency 'sprockets-rails', '3.4.2'
50
51
  gem.add_development_dependency 'sqlite3', '1.4.2'
51
52
  gem.add_development_dependency 'tzinfo-data', '~> 1.2022.1'
52
53
  gem.add_development_dependency 'yard', '0.9.27'
data/config/yardstick.yml CHANGED
@@ -31,6 +31,7 @@ rules:
31
31
  - Azeroth::Exception::InvalidOptions#initialize
32
32
  - Azeroth::Model#initialize
33
33
  - Azeroth::Options#initialize
34
+ - Azeroth::ParamsBuilder#initialize
34
35
  - Azeroth::RequestHandler#initialize
35
36
  - Azeroth::ResourceBuilder#initialize
36
37
  - Azeroth::ResourceRouteBuilder#initialize
data/docker-compose.yml CHANGED
@@ -21,11 +21,3 @@ services:
21
21
  <<: *base
22
22
  depends_on: [base_build]
23
23
  command: /bin/bash -c 'rspec && yard && rake yardstick_measure && rake verify_measurements'
24
-
25
- circleci:
26
- image: azeroth_circleci
27
- build:
28
- context: ./
29
- dockerfile: Dockerfile.circleci
30
- volumes:
31
- - .:/home/circleci/project
@@ -25,7 +25,9 @@ module Azeroth
25
25
  # @return [Hash]
26
26
  def as_json
27
27
  attributes_map.inject({}) do |hash, (method, options)|
28
- new_hash = KeyValueExtractor.new(decorator, method, options).as_json
28
+ new_hash = KeyValueExtractor.new(
29
+ decorator: decorator, attribute: method, options: options
30
+ ).as_json
29
31
  hash.merge!(new_hash)
30
32
  end
31
33
  end
@@ -11,18 +11,14 @@ module Azeroth
11
11
  #
12
12
  # A decorator is infered for the value / attribute
13
13
  # or used from the options given
14
- class KeyValueExtractor
14
+ class KeyValueExtractor < Sinclair::Model
15
+ initialize_with(:decorator, :attribute, :options)
15
16
  # @param decorator [Decorator] decorator object
16
17
  # @param attribute [Symbol] attribute to be used on output hash
17
18
  # @param options [Decorator::Options] decoration options
18
19
  # @option options if [Proc,Symbol] conditional to be
19
20
  # checked when exposing field
20
21
  # (see {Decorator::Options#if})
21
- def initialize(decorator, attribute, options)
22
- @decorator = decorator
23
- @attribute = attribute
24
- @options = options
25
- end
26
22
 
27
23
  # Return hash for attribute
28
24
  #
@@ -38,9 +34,8 @@ module Azeroth
38
34
  }
39
35
  end
40
36
 
41
- # private
37
+ private
42
38
 
43
- attr_reader :decorator, :attribute, :options
44
39
  # @method decorator
45
40
  # @api private
46
41
  # @private
@@ -35,18 +35,13 @@ module Azeroth
35
35
  [only].flatten.map(&:to_sym) - [except].flatten.map(&:to_sym)
36
36
  end
37
37
 
38
- # Returns event dispatcher
39
- #
40
- # Event dispatcher is responsible for
41
- # sending events such as +before_save+
42
- # to it's correct calling point
43
- #
44
- # @return [Jace::Dispatcher]
45
- def event_dispatcher(event)
46
- Jace::Dispatcher.new(
47
- before: try("before_#{event}"),
48
- after: try("after_#{event}")
49
- )
38
+ # Returns the event registry
39
+ #
40
+ # Event registry is used to handle events within the request
41
+ #
42
+ # @return [Jace::Registry]
43
+ def event_registry
44
+ @event_registry ||= build_event_registry
50
45
  end
51
46
 
52
47
  alias paginated? paginated
@@ -131,5 +126,22 @@ module Azeroth
131
126
  # Number of elements when pagination is active
132
127
  #
133
128
  # @return [Integer]
129
+
130
+ private
131
+
132
+ # private
133
+ #
134
+ # Builds the event registr
135
+ #
136
+ # The event registry is build using the before
137
+ # and after actions defined in optionsy
138
+ #
139
+ # @return [Jace::Registry]
140
+ def build_event_registry
141
+ Jace::Registry.new.tap do |registry|
142
+ registry.register(:save, :after, &after_save)
143
+ registry.register(:save, :before, &before_save)
144
+ end
145
+ end
134
146
  end
135
147
  end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Azeroth
4
+ # @api private
5
+ # @author Darthjee
6
+ #
7
+ # Class responsible for adding params handling methods to a controller
8
+ class ParamsBuilder < Sinclair::Model
9
+ # @!method initialize(model:, builder:)
10
+ # @api private
11
+ #
12
+ # @param model [Model] Resource interface
13
+ # @param builder [Sinclair] Methods builder
14
+ #
15
+ # @return [ParamsBuilder]
16
+ initialize_with(:model, :builder, writter: false)
17
+
18
+ # Append the params methods to be built
19
+ #
20
+ # @return [Array<Sinclair::MethodDefinition>]
21
+ def append
22
+ method_name = name
23
+ allowed_attributes = permitted_attributes.map(&:to_sym)
24
+
25
+ add_method("#{name}_id") { params.require(:id) }
26
+ add_method("#{name}_params") do
27
+ params.require(method_name)
28
+ .permit(*allowed_attributes)
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ # @method model
35
+ # @api private
36
+ # @private
37
+ #
38
+ # Resource interface
39
+ #
40
+ # @return [Model]
41
+
42
+ # @method builder
43
+ # @api private
44
+ # @private
45
+ #
46
+ # Methods builder
47
+ #
48
+ # @return [Sinclair]
49
+
50
+ delegate :add_method, to: :builder
51
+ # @method add_method
52
+ # @api private
53
+ # @private
54
+ #
55
+ # Appends a method
56
+ #
57
+ # @return [Array<Sinclair::MethodDefinition>]
58
+
59
+ delegate :name, :klass, to: :model
60
+ # @method name
61
+ # @api private
62
+ # @private
63
+ #
64
+ # Resource name
65
+ #
66
+ # @return [Symbol,String]
67
+
68
+ # @method klass
69
+ # @api private
70
+ # @private
71
+ #
72
+ # Controller to be changed
73
+ #
74
+ # @return [Array<Sinclair::MethodDefinition>]
75
+
76
+ # Returns all updatable attributes
77
+ #
78
+ # @return [Array<String>]
79
+ def permitted_attributes
80
+ @permitted_attributes ||= klass.attribute_names - ['id']
81
+ end
82
+ end
83
+ end
@@ -36,7 +36,9 @@ module Azeroth
36
36
 
37
37
  # @private
38
38
  #
39
- # Update the resource, either by running update_with
39
+ # Update the resource
40
+ #
41
+ # This update happens by either by running update_with
40
42
  # or directly updating the attributes in the object
41
43
  #
42
44
  # @return [Object] updated resource
@@ -119,8 +119,7 @@ module Azeroth
119
119
  #
120
120
  # @return [Object] Result of given block
121
121
  def trigger_event(event, &block)
122
- options.event_dispatcher(event)
123
- .dispatch(controller, &block)
122
+ options.event_registry.trigger(event, controller, &block)
124
123
  end
125
124
 
126
125
  # @private
@@ -9,13 +9,15 @@ module Azeroth
9
9
  # The builder adds 2 methods, one for listing all
10
10
  # entries of a resource, and one for fetching an specific
11
11
  # entry
12
- class ResourceBuilder
13
- # @param model [Model] Resource model interface
14
- # @param builder [Sinclair] method builder
15
- def initialize(model, builder)
16
- @model = model
17
- @builder = builder
18
- end
12
+ class ResourceBuilder < Sinclair::Model
13
+ # @!method initialize(model:, builder:)
14
+ # @api private
15
+ #
16
+ # @param model [Model] Resource model interface
17
+ # @param builder [Sinclair] method builder
18
+ #
19
+ # @return [ResourceBuilder]
20
+ initialize_with(:model, :builder, writter: false)
19
21
 
20
22
  # Append methods to be built to the builder
21
23
  #
@@ -28,9 +30,6 @@ module Azeroth
28
30
  add_method(name, "@#{name} ||= #{plural}.find(#{name}_id)")
29
31
  end
30
32
 
31
- private
32
-
33
- attr_reader :model, :builder
34
33
  # @method model
35
34
  # @api private
36
35
  # @private
@@ -13,12 +13,12 @@ module Azeroth
13
13
  # @see ResourceRouteBuilder
14
14
  # @see RoutesBuilder
15
15
  class Builder
16
- # @param clazz [ActionController::Base] Controller to
16
+ # @param klass [ActionController::Base] Controller to
17
17
  # to be changed
18
18
  # @param model_name [Symbol,String]
19
19
  # @param options [Options]
20
- def initialize(clazz, model_name, options)
21
- @clazz = clazz
20
+ def initialize(klass, model_name, options)
21
+ @klass = klass
22
22
  @options = options
23
23
  @model = Azeroth::Model.new(model_name, options)
24
24
 
@@ -30,8 +30,8 @@ module Azeroth
30
30
 
31
31
  private
32
32
 
33
- attr_reader :clazz, :model, :options
34
- # @method clazz
33
+ attr_reader :klass, :model, :options
34
+ # @method klass
35
35
  # @api private
36
36
  # @private
37
37
  #
@@ -71,7 +71,7 @@ module Azeroth
71
71
  #
72
72
  # @return [Array<Sinclair::MethodDefinition>]
73
73
 
74
- delegate :name, :klass, to: :model
74
+ delegate :name, to: :model
75
75
  # @method name
76
76
  # @api private
77
77
  # @private
@@ -80,14 +80,6 @@ module Azeroth
80
80
  #
81
81
  # @return [Symbol,String]
82
82
 
83
- # @method klass
84
- # @api private
85
- # @private
86
- #
87
- # Controller to be changed
88
- #
89
- # @return [Array<Sinclair::MethodDefinition>]
90
-
91
83
  # @api private
92
84
  # @private
93
85
  #
@@ -97,50 +89,40 @@ module Azeroth
97
89
  #
98
90
  # @see https://www.rubydoc.info/gems/sinclair Sinclair
99
91
  def builder
100
- @builder ||= Sinclair.new(clazz)
92
+ @builder ||= Sinclair.new(klass)
101
93
  end
102
94
 
103
95
  # Add methods for id and parameters
104
96
  #
105
97
  # @return [Array<Sinclair::MethodDefinition>]
106
98
  def add_params
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
- )
99
+ ParamsBuilder.new(
100
+ model: model, builder: builder
101
+ ).append
115
102
  end
116
103
 
117
104
  # Add methods for resource fetching
118
105
  #
119
106
  # @return [Array<Sinclair::MethodDefinition>]
120
107
  def add_resource
121
- ResourceBuilder.new(model, builder).append
108
+ ResourceBuilder.new(model: model, builder: builder).append
122
109
  end
123
110
 
124
111
  # Add metohods for each route
125
112
  #
126
113
  # @return [Array<Sinclair::MethodDefinition>]
127
114
  def add_routes
128
- RoutesBuilder.new(model, builder, options).append
115
+ RoutesBuilder.new(
116
+ model: model, builder: builder, options: options
117
+ ).append
129
118
  end
130
119
 
131
120
  # Add helpers to render objects on template
132
121
  #
133
122
  # @return [String]
134
123
  def add_helpers
135
- clazz.public_send(:helper_method, model.name)
136
- clazz.public_send(:helper_method, model.plural)
137
- end
138
-
139
- # Returns all updatable attributes
140
- #
141
- # @return [Array<String>]
142
- def permitted_attributes
143
- @permitted_attributes ||= klass.attribute_names - ['id']
124
+ klass.public_send(:helper_method, model.name)
125
+ klass.public_send(:helper_method, model.plural)
144
126
  end
145
127
  end
146
128
  end
@@ -14,136 +14,7 @@ module Azeroth
14
14
  # @return (see Resourceable.resource_for)
15
15
  #
16
16
  # @see (see Resourceable.resource_for)
17
- #
18
- # @example Controller without delete
19
- # class DocumentsController < ApplicationController
20
- # include Azeroth::Resourceable
21
- #
22
- # resource_for :document, except: :delete
23
- # end
24
- #
25
- # @example Controller with only create, show and list
26
- # class DocumentsController < ApplicationController
27
- # include Azeroth::Resourceable
28
- #
29
- # resource_for :document, only: %w[create index show]
30
- # end
31
- #
32
- # @example complete example gmaes and publishers
33
- # class PublishersController < ApplicationController
34
- # include Azeroth::Resourceable
35
- # skip_before_action :verify_authenticity_token
36
- #
37
- # resource_for :publisher, only: %i[create index]
38
- # end
39
- #
40
- # class GamesController < ApplicationController
41
- # include Azeroth::Resourceable
42
- # skip_before_action :verify_authenticity_token
43
- #
44
- # resource_for :game, except: :delete
45
- #
46
- # private
47
- #
48
- # def games
49
- # publisher.games
50
- # end
51
- #
52
- # def publisher
53
- # @publisher ||= Publisher.find(publisher_id)
54
- # end
55
- #
56
- # def publisher_id
57
- # params.require(:publisher_id)
58
- # end
59
- # end
60
- #
61
- # ActiveRecord::Schema.define do
62
- # self.verbose = false
63
- #
64
- # create_table :publishers, force: true do |t|
65
- # t.string :name
66
- # end
67
- #
68
- # create_table :games, force: true do |t|
69
- # t.string :name
70
- # t.integer :publisher_id
71
- # end
72
- # end
73
- #
74
- # class Publisher < ActiveRecord::Base
75
- # has_many :games
76
- # end
77
- #
78
- # class Game < ActiveRecord::Base
79
- # belongs_to :publisher
80
- # end
81
- #
82
- # class Game::Decorator < Azeroth::Decorator
83
- # expose :id
84
- # expose :name
85
- # expose :publisher, decorator: NameDecorator
86
- # end
87
- #
88
- # @example requesting games and publishers
89
- # post "/publishers.json", params: {
90
- # publisher: {
91
- # name: 'Nintendo'
92
- # }
93
- # }
94
- #
95
- # publisher = JSON.parse(response.body)
96
- # # returns
97
- # # {
98
- # # 'id' => 11,
99
- # # 'name' => 'Nintendo'
100
- # # }
101
- #
102
- # publisher = Publisher.last
103
- # post "/publishers/#{publisher['id']}/games.json", params: {
104
- # game: {
105
- # name: 'Pokemon'
106
- # }
107
- # }
108
- #
109
- # game = Game.last
110
- #
111
- # JSON.parse(response.body)
112
- # # returns
113
- # # {
114
- # # id: game.id,
115
- # # name: 'Pokemon',
116
- # # publisher: {
117
- # # name: 'Nintendo'
118
- # # }
119
- # }
120
- #
121
- # @example Controller with before_save
122
- # class PokemonsController < ApplicationController
123
- # include Azeroth::Resourceable
124
- #
125
- # resource_for :pokemon,
126
- # only: %i[create update],
127
- # before_save: :set_favorite
128
- #
129
- # private
130
- #
131
- # def set_favorite
132
- # pokemon.favorite = true
133
- # end
134
- #
135
- # def pokemons
136
- # master.pokemons
137
- # end
138
- #
139
- # def master
140
- # @master ||= PokemonMaster.find(master_id)
141
- # end
142
- #
143
- # def master_id
144
- # params.require(:pokemon_master_id)
145
- # end
146
- # end
17
+ # @example (see Resourceable.resource_for)
147
18
  def resource_for(name, **options)
148
19
  Builder.new(
149
20
  self, name, Azeroth::Options.new(options)