azeroth 0.6.5 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8e28a5c409533eebedc8579f02941b55a956b8296459243b8cf5572857f64d1c
4
- data.tar.gz: ba50b329165868a7b2a65b4762a20c91898c45593bedc528e440d6d51b9fae01
3
+ metadata.gz: e12fe40f870d7fdb3cea6050cd78c2e9fc664645afc834be42036f01261d7078
4
+ data.tar.gz: ce539d54b582033f05342045a923313367a307bb999d8ec7c2b7e9aabc550edb
5
5
  SHA512:
6
- metadata.gz: 38ca1d96bf67471f7eb0bdd1c626832e534c9418646d09d2381659096c1739a8d06b592a8c4063e1068f4e2fa8502bc9fcc25f2a9e6c998c659459eea837325c
7
- data.tar.gz: 9cb5e259c5f9961d60d6ae8c50563ada7d45ab2a850f2cf79dfd8977d5b30b53ea9e029617466d19a237c2256db3c6491fe9a674cb463ad074e76b78693852ee
6
+ metadata.gz: 744f9bf09c7c3ab19c8ea8541f322c498983904ec1b084dc52bb9e07f05e8fdeddc05c30dc5d52d8553412c4b00a1f82c1cdcd83fa08e8cc5e1ca86ed894097f
7
+ data.tar.gz: bffa4c272a0e8610d694b3762627eb3ad81416bc979da72f789ea6b29be97e8ff0b3790a14a74108b1a81dc932b69fff2dc27a9cc4bcd07874fe437efc3069d8
@@ -1,6 +1,22 @@
1
1
  version: 2
2
+ workflows:
3
+ version: 2
4
+ test-and-build:
5
+ jobs:
6
+ - test:
7
+ filters:
8
+ tags:
9
+ only: /.*/
10
+ - build-and-release:
11
+ requires: [test]
12
+ filters:
13
+ tags:
14
+ only: /\d+\.\d+\.\d+/
15
+ branches:
16
+ only:
17
+ - master
2
18
  jobs:
3
- build:
19
+ test:
4
20
  docker:
5
21
  - image: darthjee/circleci_rails_gems:0.5.1
6
22
  environment:
@@ -34,3 +50,22 @@ jobs:
34
50
  - run:
35
51
  name: Check unit tests
36
52
  command: check_specs
53
+ build-and-release:
54
+ docker:
55
+ - image: darthjee/circleci_rails_gems:0.5.1
56
+ environment:
57
+ PROJECT: azeroth
58
+ steps:
59
+ - checkout
60
+ - run:
61
+ name: Bundle Install
62
+ command: bundle install
63
+ - run:
64
+ name: Signin
65
+ command: scripts/build.sh signin
66
+ - run:
67
+ name: Build Gem
68
+ command: scripts/build.sh build
69
+ - run:
70
+ name: Push Gem
71
+ command: scripts/build.sh push
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.6.5](https://www.rubydoc.info/gems/azeroth/0.6.5)
14
+ [https://www.rubydoc.info/gems/azeroth/0.7.0](https://www.rubydoc.info/gems/azeroth/0.7.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
@@ -25,6 +25,25 @@ does not perform database operations
25
25
  Future versions will enable `html` rendering to also perform
26
26
  database operations.
27
27
 
28
+ Installation
29
+ ---------------
30
+
31
+ - Install it
32
+
33
+ ```ruby
34
+ gem install azeroth
35
+ ```
36
+
37
+ - Or add Sinclair to your `Gemfile` and `bundle install`:
38
+
39
+ ```ruby
40
+ gem 'azeroth'
41
+ ```
42
+
43
+ ```bash
44
+ bundle install azeroth
45
+ ```
46
+
28
47
  Usage
29
48
  -----
30
49
 
@@ -36,9 +55,10 @@ which adds a resource and action methods for `create`, `show`, `index`,
36
55
  `update`, `delete`, `edit`
37
56
 
38
57
  It accepts options
39
- - only List of actions to be built
40
- - except List of actions to not to be built
41
- - decorator Decorator class or flag allowing/disallowing decorators
58
+ - only: List of actions to be built
59
+ - except: List of actions to not to be built
60
+ - decorator: Decorator class or flag allowing/disallowing decorators
61
+ - before_save: Method/Proc to be ran before saving the resource on create or update
42
62
 
43
63
  ```ruby
44
64
  # publishers_controller.rb
@@ -76,6 +96,36 @@ It accepts options
76
96
  end
77
97
  ```
78
98
 
99
+ ```ruby
100
+ # pokemons_controller.rb
101
+
102
+ class PokemonsController < ApplicationController
103
+ include Azeroth::Resourceable
104
+
105
+ resource_for :pokemon,
106
+ only: %i[create update],
107
+ before_save: :set_favorite
108
+
109
+ private
110
+
111
+ def set_favorite
112
+ pokemon.favorite = true
113
+ end
114
+
115
+ def pokemons
116
+ master.pokemons
117
+ end
118
+
119
+ def master
120
+ @master ||= PokemonMaster.find(master_id)
121
+ end
122
+
123
+ def master_id
124
+ params.require(:pokemon_master_id)
125
+ end
126
+ end
127
+ ```
128
+
79
129
  ## Azeroth::Decorator
80
130
 
81
131
  [Decorators](https://www.rubydoc.info/gems/azeroth/Azeroth/Decorator) are
@@ -20,6 +20,7 @@ Gem::Specification.new do |gem|
20
20
 
21
21
  gem.add_runtime_dependency 'activesupport', '~> 5.2.0'
22
22
  gem.add_runtime_dependency 'darthjee-active_ext', '>= 1.3.2'
23
+ gem.add_runtime_dependency 'jace', '>= 0.0.3'
23
24
  gem.add_runtime_dependency 'sinclair', '>= 1.6.4'
24
25
 
25
26
  gem.add_development_dependency 'actionpack', '5.2.4.2'
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'sinclair'
4
+ require 'jace'
4
5
 
5
6
  # @api public
6
7
  #
@@ -10,10 +10,15 @@ module Azeroth
10
10
  # Sinclair::Options
11
11
  class Options < Sinclair::Options
12
12
  # Default options
13
+ #
14
+ # @api public
15
+ #
16
+ # @see Resourceable::ClassMethods#resource_for
13
17
  DEFAULT_OPTIONS = {
14
18
  only: %i[create destroy edit index new show update],
15
19
  except: [],
16
- decorator: true
20
+ decorator: true,
21
+ before_save: nil
17
22
  }.freeze
18
23
 
19
24
  with_options DEFAULT_OPTIONS
@@ -25,6 +30,19 @@ module Azeroth
25
30
  [only].flatten.map(&:to_sym) - [except].flatten.map(&:to_sym)
26
31
  end
27
32
 
33
+ # Returns event dispatcher
34
+ #
35
+ # Event dispatcher is responsible for
36
+ # sending events such as +before_save+
37
+ # to it's correct calling point
38
+ #
39
+ # @return [Jace::Dispatcher]
40
+ def event_dispatcher(event)
41
+ Jace::Dispatcher.new(
42
+ before: try("before_#{event}")
43
+ )
44
+ end
45
+
28
46
  # @method only
29
47
  # @api private
30
48
  #
@@ -50,5 +68,16 @@ module Azeroth
50
68
  # model.as_json
51
69
  #
52
70
  # @return [Decorator,TrueClass,FalseClass]
71
+
72
+ # @method before_save
73
+ # @api private
74
+ #
75
+ # Block or method name to be run before save
76
+ #
77
+ # The given method or block will be ran
78
+ # before committing changes in models
79
+ # to database
80
+ #
81
+ # @return [Symbol,Proc]
53
82
  end
54
83
  end
@@ -18,9 +18,10 @@ module Azeroth
18
18
 
19
19
  # @param controller [ApplicationController]
20
20
  # @param model [Azeroth::Model]
21
- def initialize(controller, model)
21
+ def initialize(controller, model, options)
22
22
  @controller = controller
23
23
  @model = model
24
+ @options = options
24
25
  end
25
26
 
26
27
  # process the request
@@ -44,7 +45,7 @@ module Azeroth
44
45
 
45
46
  private
46
47
 
47
- attr_reader :controller, :model
48
+ attr_reader :controller, :model, :options
48
49
  # @method controller
49
50
  # @api private
50
51
  # @private
@@ -61,6 +62,14 @@ module Azeroth
61
62
  #
62
63
  # @return [Azeroth::Model]
63
64
 
65
+ # @method options
66
+ # @api private
67
+ # @private
68
+ #
69
+ # Handling options
70
+ #
71
+ # @return [Azeroth::Options]
72
+
64
73
  delegate :params, to: :controller
65
74
  # @method params
66
75
  # @api private
@@ -104,5 +113,33 @@ module Azeroth
104
113
  def status
105
114
  :ok
106
115
  end
116
+
117
+ # @private
118
+ #
119
+ # Run a block triggering the event
120
+ #
121
+ # @return [Object] Result of given block
122
+ def trigger_event(event, &block)
123
+ options.event_dispatcher(event)
124
+ .dispatch(controller, &block)
125
+ end
126
+
127
+ # @private
128
+ #
129
+ # Attributes to be used on resource creating
130
+ #
131
+ # @return [Hash]
132
+ def attributes
133
+ @attributes ||= controller.send("#{model.name}_params")
134
+ end
135
+
136
+ # @private
137
+ #
138
+ # Collection scope of the resource
139
+ #
140
+ # @return [ActiveRecord::Relation]
141
+ def collection
142
+ @collection = controller.send(model.plural)
143
+ end
107
144
  end
108
145
  end
@@ -24,9 +24,12 @@ module Azeroth
24
24
  #
25
25
  # @return [Object]
26
26
  def build_resource
27
- attributes = controller.send("#{model.name}_params")
28
- collection = controller.send(model.plural)
29
- collection.create(attributes)
27
+ @resource = collection.build(attributes)
28
+ controller.instance_variable_set("@#{model.name}", resource)
29
+
30
+ trigger_event(:save) do
31
+ resource.tap(&:save)
32
+ end
30
33
  end
31
34
 
32
35
  # @private
@@ -24,10 +24,10 @@ module Azeroth
24
24
  #
25
25
  # @return [Object]
26
26
  def update_resource
27
- attributes = controller.send("#{model.name}_params")
28
-
29
27
  controller.send(model.name).tap do |entry|
30
- entry.update(attributes)
28
+ trigger_event(:save) do
29
+ entry.update(attributes)
30
+ end
31
31
  end
32
32
  end
33
33
 
@@ -21,6 +21,26 @@ module Azeroth
21
21
  autoload :Builder, 'azeroth/resourceable/builder'
22
22
  autoload :ClassMethods, 'azeroth/resourceable/class_methods'
23
23
 
24
+ class << self
25
+ # @method self.resource_for(name, **options)
26
+ # @api public
27
+ #
28
+ # @param name [String, Symbol] Name of the resource
29
+ # @param options [Hash] resource building options
30
+ # @option options only [Array<Symbol,String>] List of
31
+ # actions to be built
32
+ # @option options except [Array<Symbol,String>] List of
33
+ # actions to not to be built
34
+ # @option options decorator [Azeroth::Decorator,TrueClass,FalseClass]
35
+ # Decorator class or flag allowing/disallowing decorators
36
+ # @option options before_save [Symbol,Proc] method/block
37
+ # to be ran on the controller before saving the resource
38
+ #
39
+ # @return [Array<MethodDefinition>] list of methods created
40
+ #
41
+ # @see Options::DEFAULT_OPTIONS
42
+ end
43
+
24
44
  private
25
45
 
26
46
  # @api private
@@ -9,18 +9,11 @@ module Azeroth
9
9
  module ClassMethods
10
10
  # Adds resource methods for resource
11
11
  #
12
- # @param name [String, Symbol] Name of the resource
13
- # @param options [Hash] resource building options
14
- # @option options only [Array<Symbol,String>] List of
15
- # actions to be built
16
- # @option options except [Array<Symbol,String>] List of
17
- # actions to not to be built
18
- # @option options decorator [Azeroth::Decorator,TrueClass,FalseClass]
19
- # Decorator class or flag allowing/disallowing decorators
12
+ # @param (see Resourceable.resource_for)
13
+ # @option (see Resourceable.resource_for)
14
+ # @return (see Resourceable.resource_for)
20
15
  #
21
- # @return [Array<MethodDefinition>] list of methods created
22
- #
23
- # @see Options
16
+ # @see (see Resourceable.resource_for)
24
17
  #
25
18
  # @example Controller without delete
26
19
  # class DocumentsController < ApplicationController
@@ -124,6 +117,33 @@ module Azeroth
124
117
  # # name: 'Nintendo'
125
118
  # # }
126
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
127
147
  def resource_for(name, **options)
128
148
  Builder.new(
129
149
  self, name, Azeroth::Options.new(options)
@@ -62,13 +62,14 @@ module Azeroth
62
62
 
63
63
  def route_code(route)
64
64
  model_interface = model
65
+ options_object = options
65
66
  handler_class = Azeroth::RequestHandler.const_get(
66
67
  route.to_s.capitalize
67
68
  )
68
69
 
69
70
  proc do
70
71
  handler_class.new(
71
- self, model_interface
72
+ self, model_interface, options_object
72
73
  ).process
73
74
  end
74
75
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Azeroth
4
- VERSION = '0.6.5'
4
+ VERSION = '0.7.0'
5
5
  end
@@ -0,0 +1,47 @@
1
+ #!/bin/bash
2
+
3
+ function version() {
4
+ echo $(cat lib/$PROJECT/version.rb | grep VERSION | sed -e "s/.*'\\(.*\\)'.*/\\1/g")
5
+ }
6
+
7
+ function isTagged() {
8
+ VERSION=$(version)
9
+ TAG=$(git tag | tail -n 1)
10
+
11
+ if [ $VERSION = $TAG ]; then
12
+ return 0
13
+ else
14
+ return 1
15
+ fi
16
+ }
17
+
18
+ ACTION=$1
19
+
20
+ case $ACTION in
21
+ "signin")
22
+ mkdir ~/.gem
23
+ echo "---" > ~/.gem/credentials
24
+ echo ":rubygems_api_key: $RUBY_GEMS_API_KEY" >> ~/.gem/credentials
25
+ chmod 600 ~/.gem/credentials
26
+ ;;
27
+ "build")
28
+ if $(isTagged); then
29
+ rake build
30
+ else
31
+ echo version did not change
32
+ fi
33
+ ;;
34
+ "push")
35
+ if $(isTagged); then
36
+ VERSION=$(version)
37
+ gem push "pkg/$PROJECT-$VERSION.gem"
38
+ else
39
+ echo version did not change
40
+ fi
41
+ ;;
42
+ *)
43
+ echo Usage:
44
+ echo "$0 build # builds gem"
45
+ echo "$0 push # pushes gem"
46
+ ;;
47
+ esac
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe PokemonMastersController do
6
+ describe 'POST create' do
7
+ let(:parameters) do
8
+ {
9
+ format: :json,
10
+ pokemon_master: {
11
+ first_name: 'Ash'
12
+ }
13
+ }
14
+ end
15
+
16
+ it 'creates pokemon master' do
17
+ expect { post :create, params: parameters }
18
+ .to change(PokemonMaster, :count)
19
+ .by(1)
20
+ end
21
+
22
+ it 'updates pokemon master age' do
23
+ post :create, params: parameters
24
+
25
+ expect(PokemonMaster.last.age).to eq(10)
26
+ end
27
+ end
28
+
29
+ describe 'POST update' do
30
+ let(:master) do
31
+ create(:pokemon_master, age: 20, last_name: nil)
32
+ end
33
+
34
+ let(:parameters) do
35
+ {
36
+ id: master.id,
37
+ format: :json,
38
+ pokemon_master: { last_name: 'Joe' }
39
+ }
40
+ end
41
+
42
+ it 'updates pokemon master' do
43
+ expect { post :update, params: parameters }
44
+ .to change { master.reload.last_name }
45
+ .from(nil)
46
+ .to('Joe')
47
+ end
48
+
49
+ it 'updates pokemon master age' do
50
+ expect { post :update, params: parameters }
51
+ .to change { master.reload.age }
52
+ .from(20)
53
+ .to(10)
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe PokemonsController do
6
+ let(:master) { create(:pokemon_master) }
7
+
8
+ describe 'POST create' do
9
+ let(:parameters) do
10
+ {
11
+ pokemon_master_id: master.id,
12
+ format: :json,
13
+ pokemon: { name: 'Bulbasaur' }
14
+ }
15
+ end
16
+
17
+ it 'creates pokemon' do
18
+ expect { post :create, params: parameters }
19
+ .to change(Pokemon, :count)
20
+ .by(1)
21
+ end
22
+
23
+ it 'updates pokemon to be favorite' do
24
+ expect { post :create, params: parameters }
25
+ .to change { master.reload.favorite_pokemon }
26
+ .from(nil)
27
+ end
28
+ end
29
+
30
+ describe 'POST update' do
31
+ let(:pokemon) { create(:pokemon) }
32
+ let(:master) { pokemon.pokemon_master }
33
+
34
+ let(:parameters) do
35
+ {
36
+ pokemon_master_id: master.id,
37
+ id: pokemon.id,
38
+ format: :json,
39
+ pokemon: { name: 'Butterfree' }
40
+ }
41
+ end
42
+
43
+ it 'updates pokemon' do
44
+ expect { post :update, params: parameters }
45
+ .to change { pokemon.reload.name }
46
+ .from('Bulbasaur')
47
+ .to('Butterfree')
48
+ end
49
+
50
+ it 'updates pokemon to be favorite' do
51
+ expect { post :update, params: parameters }
52
+ .to change { pokemon.reload.favorite }
53
+ .from(nil)
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class PokemonMastersController < ApplicationController
4
+ include Azeroth::Resourceable
5
+
6
+ resource_for :pokemon_master,
7
+ only: %i[create update],
8
+ before_save: proc { pokemon_master.age = 10 }
9
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ class PokemonsController < ApplicationController
4
+ include Azeroth::Resourceable
5
+
6
+ resource_for :pokemon,
7
+ only: %i[create update],
8
+ before_save: :set_favorite
9
+
10
+ private
11
+
12
+ def set_favorite
13
+ pokemon.favorite = true
14
+ end
15
+
16
+ def pokemons
17
+ master.pokemons
18
+ end
19
+
20
+ def master
21
+ @master ||= PokemonMaster.find(master_id)
22
+ end
23
+
24
+ def master_id
25
+ params.require(:pokemon_master_id)
26
+ end
27
+ end
@@ -8,4 +8,8 @@ Rails.application.routes.draw do
8
8
  resources :publishers, only: %i[create index] do
9
9
  resources :games, except: :delete
10
10
  end
11
+
12
+ resources :pokemon_masters, only: %i[create update] do
13
+ resources :pokemons, only: %i[create update]
14
+ end
11
15
  end
@@ -23,6 +23,89 @@ describe Azeroth::RequestHandler::Create do
23
23
  .by(1)
24
24
  end
25
25
  end
26
+
27
+ context 'with before_save block option' do
28
+ it_behaves_like 'a request handler', status: :created do
29
+ let(:block) do
30
+ value = 10
31
+ proc do
32
+ document.reference = "X-MAGIC-#{value}"
33
+ end
34
+ end
35
+
36
+ let(:options_hash) do
37
+ {
38
+ before_save: block
39
+ }
40
+ end
41
+
42
+ let(:extra_params) do
43
+ {
44
+ document: {
45
+ name: 'My Document'
46
+ }
47
+ }
48
+ end
49
+
50
+ let(:expected_json) do
51
+ {
52
+ 'name' => 'My Document',
53
+ 'reference' => 'X-MAGIC-10'
54
+ }
55
+ end
56
+
57
+ it 'creates entry' do
58
+ expect { handler.process }
59
+ .to change(Document, :count)
60
+ .by(1)
61
+ end
62
+
63
+ it 'changes entry before saving' do
64
+ handler.process
65
+
66
+ expect(Document.last.reference)
67
+ .to eq('X-MAGIC-10')
68
+ end
69
+ end
70
+ end
71
+
72
+ context 'with before_save symbol option' do
73
+ it_behaves_like 'a request handler', status: :created do
74
+ let(:options_hash) do
75
+ {
76
+ before_save: :add_magic_reference
77
+ }
78
+ end
79
+
80
+ let(:extra_params) do
81
+ {
82
+ document: {
83
+ name: 'My Document'
84
+ }
85
+ }
86
+ end
87
+
88
+ let(:expected_json) do
89
+ {
90
+ 'name' => 'My Document',
91
+ 'reference' => 'X-MAGIC-15'
92
+ }
93
+ end
94
+
95
+ it 'creates entry' do
96
+ expect { handler.process }
97
+ .to change(Document, :count)
98
+ .by(1)
99
+ end
100
+
101
+ it 'changes entry before saving' do
102
+ handler.process
103
+
104
+ expect(Document.last.reference)
105
+ .to eq('X-MAGIC-15')
106
+ end
107
+ end
108
+ end
26
109
  end
27
110
 
28
111
  context 'when payload is invalid' do
@@ -30,6 +30,97 @@ describe Azeroth::RequestHandler::Update do
30
30
  end
31
31
  end
32
32
 
33
+ context 'with before_save block option' do
34
+ it_behaves_like 'a request handler' do
35
+ let(:block) do
36
+ value = 10
37
+ proc do
38
+ document.reference = "X-MAGIC-#{value}"
39
+ end
40
+ end
41
+
42
+ let(:options_hash) do
43
+ {
44
+ before_save: block
45
+ }
46
+ end
47
+
48
+ let(:expected_resource) { document }
49
+
50
+ let(:extra_params) do
51
+ {
52
+ id: document.id,
53
+ document: {
54
+ name: 'New Name'
55
+ }
56
+ }
57
+ end
58
+
59
+ let(:expected_json) do
60
+ {
61
+ 'name' => 'New Name',
62
+ 'reference' => 'X-MAGIC-10'
63
+ }
64
+ end
65
+
66
+ it 'updates the values given by request' do
67
+ expect { handler.process }
68
+ .to change { document.reload.name }
69
+ .from(document.name)
70
+ .to('New Name')
71
+ end
72
+
73
+ it 'updates the values done by before_save' do
74
+ expect { handler.process }
75
+ .to change { document.reload.reference }
76
+ .from(nil)
77
+ .to('X-MAGIC-10')
78
+ end
79
+ end
80
+ end
81
+
82
+ context 'with before_save symbol option' do
83
+ it_behaves_like 'a request handler' do
84
+ let(:options_hash) do
85
+ {
86
+ before_save: :add_magic_reference
87
+ }
88
+ end
89
+
90
+ let(:expected_resource) { document }
91
+
92
+ let(:extra_params) do
93
+ {
94
+ id: document.id,
95
+ document: {
96
+ name: 'New Name'
97
+ }
98
+ }
99
+ end
100
+
101
+ let(:expected_json) do
102
+ {
103
+ 'name' => 'New Name',
104
+ 'reference' => 'X-MAGIC-15'
105
+ }
106
+ end
107
+
108
+ it 'updates the values given by request' do
109
+ expect { handler.process }
110
+ .to change { document.reload.name }
111
+ .from(document.name)
112
+ .to('New Name')
113
+ end
114
+
115
+ it 'updates the values done by before_save' do
116
+ expect { handler.process }
117
+ .to change { document.reload.reference }
118
+ .from(nil)
119
+ .to('X-MAGIC-15')
120
+ end
121
+ end
122
+ end
123
+
33
124
  context 'when payload is invalid' do
34
125
  it_behaves_like 'a request handler',
35
126
  status: :unprocessable_entity do
@@ -4,7 +4,9 @@ require 'spec_helper'
4
4
 
5
5
  describe Azeroth::RequestHandler do
6
6
  describe '#process' do
7
- subject(:handler) { handler_class.new(controller, model) }
7
+ subject(:handler) do
8
+ handler_class.new(controller, model, options)
9
+ end
8
10
 
9
11
  let(:controller) { controller_class.new }
10
12
  let(:params) { ActionController::Parameters.new(parameters) }
@@ -10,6 +10,10 @@ class RequestHandlerController < ActionController::Base
10
10
  end
11
11
 
12
12
  def document
13
- documents.find(params.require(:id))
13
+ @document ||= documents.find(params.require(:id))
14
+ end
15
+
16
+ def add_magic_reference
17
+ document.reference = 'X-MAGIC-15'
14
18
  end
15
19
  end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :pokemon, class: '::Pokemon' do
5
+ name { 'Bulbasaur' }
6
+ pokemon_master
7
+ end
8
+ end
@@ -1,12 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  shared_examples 'a request handler' do |status: :ok|
4
- subject(:handler) { described_class.new(controller, model) }
4
+ subject(:handler) do
5
+ described_class.new(controller, model, options)
6
+ end
5
7
 
6
8
  let(:controller) { controller_class.new }
7
9
  let(:params) { ActionController::Parameters.new(parameters) }
8
10
  let(:model) { Azeroth::Model.new(:document, options) }
9
- let(:options) { Azeroth::Options.new }
11
+ let(:options) { Azeroth::Options.new(options_hash) }
12
+ let(:options_hash) { {} }
10
13
  let(:extra_params) { {} }
11
14
 
12
15
  let(:decorator) { Document::Decorator.new(expected_resource) }
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.6.5
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Darthjee
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-10 00:00:00.000000000 Z
11
+ date: 2020-05-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: 1.3.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: jace
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 0.0.3
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 0.0.3
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: sinclair
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -435,9 +449,12 @@ files:
435
449
  - lib/azeroth/resourceable/class_methods.rb
436
450
  - lib/azeroth/routes_builder.rb
437
451
  - lib/azeroth/version.rb
452
+ - scripts/build.sh
438
453
  - spec/controllers/documents_controller_spec.rb
439
454
  - spec/controllers/documents_with_error_controller_spec.rb
440
455
  - spec/controllers/index_documents_controller_spec.rb
456
+ - spec/controllers/pokemon_masters_controller_spec.rb
457
+ - spec/controllers/pokemons_controller_spec.rb
441
458
  - spec/dummy/.ruby-version
442
459
  - spec/dummy/Rakefile
443
460
  - spec/dummy/app/assets/config/manifest.js
@@ -454,6 +471,8 @@ files:
454
471
  - spec/dummy/app/controllers/documents_with_error_controller.rb
455
472
  - spec/dummy/app/controllers/games_controller.rb
456
473
  - spec/dummy/app/controllers/index_documents_controller.rb
474
+ - spec/dummy/app/controllers/pokemon_masters_controller.rb
475
+ - spec/dummy/app/controllers/pokemons_controller.rb
457
476
  - spec/dummy/app/controllers/publishers_controller.rb
458
477
  - spec/dummy/app/helpers/application_helper.rb
459
478
  - spec/dummy/app/jobs/application_job.rb
@@ -560,6 +579,7 @@ files:
560
579
  - spec/support/factories/dummy_model.rb
561
580
  - spec/support/factories/factory.rb
562
581
  - spec/support/factories/game.rb
582
+ - spec/support/factories/pokemon.rb
563
583
  - spec/support/factories/pokemon_master.rb
564
584
  - spec/support/factories/product.rb
565
585
  - spec/support/factories/publisher.rb
@@ -594,6 +614,8 @@ test_files:
594
614
  - spec/controllers/documents_controller_spec.rb
595
615
  - spec/controllers/documents_with_error_controller_spec.rb
596
616
  - spec/controllers/index_documents_controller_spec.rb
617
+ - spec/controllers/pokemon_masters_controller_spec.rb
618
+ - spec/controllers/pokemons_controller_spec.rb
597
619
  - spec/dummy/.ruby-version
598
620
  - spec/dummy/Rakefile
599
621
  - spec/dummy/app/assets/config/manifest.js
@@ -610,6 +632,8 @@ test_files:
610
632
  - spec/dummy/app/controllers/documents_with_error_controller.rb
611
633
  - spec/dummy/app/controllers/games_controller.rb
612
634
  - spec/dummy/app/controllers/index_documents_controller.rb
635
+ - spec/dummy/app/controllers/pokemon_masters_controller.rb
636
+ - spec/dummy/app/controllers/pokemons_controller.rb
613
637
  - spec/dummy/app/controllers/publishers_controller.rb
614
638
  - spec/dummy/app/helpers/application_helper.rb
615
639
  - spec/dummy/app/jobs/application_job.rb
@@ -716,6 +740,7 @@ test_files:
716
740
  - spec/support/factories/dummy_model.rb
717
741
  - spec/support/factories/factory.rb
718
742
  - spec/support/factories/game.rb
743
+ - spec/support/factories/pokemon.rb
719
744
  - spec/support/factories/pokemon_master.rb
720
745
  - spec/support/factories/product.rb
721
746
  - spec/support/factories/publisher.rb