azeroth 0.6.5 → 0.7.4
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.
- checksums.yaml +4 -4
- data/.circleci/config.yml +37 -2
- data/Dockerfile +2 -2
- data/README.md +56 -4
- data/azeroth.gemspec +14 -13
- data/lib/azeroth.rb +1 -0
- data/lib/azeroth/model.rb +3 -1
- data/lib/azeroth/options.rb +51 -1
- data/lib/azeroth/request_handler.rb +39 -2
- data/lib/azeroth/request_handler/create.rb +31 -5
- data/lib/azeroth/request_handler/update.rb +3 -3
- data/lib/azeroth/resourceable.rb +23 -0
- data/lib/azeroth/resourceable/class_methods.rb +31 -11
- data/lib/azeroth/routes_builder.rb +2 -1
- data/lib/azeroth/version.rb +1 -1
- data/spec/controllers/pokemon_masters_controller_spec.rb +56 -0
- data/spec/controllers/pokemons_controller_spec.rb +56 -0
- data/spec/dummy/app/controllers/pokemon_masters_controller.rb +9 -0
- data/spec/dummy/app/controllers/pokemons_controller.rb +27 -0
- data/spec/dummy/config/routes.rb +4 -0
- data/spec/lib/azeroth/request_handler/create_spec.rb +272 -0
- data/spec/lib/azeroth/request_handler/update_spec.rb +91 -0
- data/spec/lib/azeroth/request_handler_spec.rb +3 -1
- data/spec/support/app/controllers/request_handler_controller.rb +17 -1
- data/spec/support/app/workers/worker.rb +5 -0
- data/spec/support/factories/pokemon.rb +8 -0
- data/spec/support/shared_examples/request_handler.rb +5 -2
- metadata +60 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 197968637291c04e3ce145d6d5dd9f84451e4b47d104d420aef7c1a5e7b999dc
|
4
|
+
data.tar.gz: 9936013b82fcc56048027c6a469130bc15913e095c5373a9b3b50d577d2fcc93
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d05f185b913c3ac80e58bfad3cdcfea1de68c4836251d5a121826961bf3779adc3e9b39e4dff6d92e72204a4bc8d355d063f0b910c4607dad17f741206a31149
|
7
|
+
data.tar.gz: 85e4d4c4625e36fd40358bf486e5bb2dd81fef82cc6fbf198545b6fdad51642d63d3ee5af2e828d0cf394ca0dfbf7aff5efd568634517a1c5236a79901275915
|
data/.circleci/config.yml
CHANGED
@@ -1,8 +1,24 @@
|
|
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
|
-
|
19
|
+
test:
|
4
20
|
docker:
|
5
|
-
- image: darthjee/circleci_rails_gems:0.
|
21
|
+
- image: darthjee/circleci_rails_gems:0.6.3
|
6
22
|
environment:
|
7
23
|
PROJECT: azeroth
|
8
24
|
steps:
|
@@ -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.6.3
|
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: build_gem.sh signin
|
66
|
+
- run:
|
67
|
+
name: Build Gem
|
68
|
+
command: build_gem.sh build
|
69
|
+
- run:
|
70
|
+
name: Push Gem
|
71
|
+
command: build_gem.sh push
|
data/Dockerfile
CHANGED
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.
|
14
|
+
[https://www.rubydoc.info/gems/azeroth/0.7.4](https://www.rubydoc.info/gems/azeroth/0.7.4)
|
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,12 @@ 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
|
62
|
+
- after_save: Method/Proc to be ran after saving the resource on create or update
|
63
|
+
- build_with: Method/Block to be ran when building the reource on create
|
42
64
|
|
43
65
|
```ruby
|
44
66
|
# publishers_controller.rb
|
@@ -76,6 +98,36 @@ It accepts options
|
|
76
98
|
end
|
77
99
|
```
|
78
100
|
|
101
|
+
```ruby
|
102
|
+
# pokemons_controller.rb
|
103
|
+
|
104
|
+
class PokemonsController < ApplicationController
|
105
|
+
include Azeroth::Resourceable
|
106
|
+
|
107
|
+
resource_for :pokemon,
|
108
|
+
only: %i[create update],
|
109
|
+
before_save: :set_favorite
|
110
|
+
|
111
|
+
private
|
112
|
+
|
113
|
+
def set_favorite
|
114
|
+
pokemon.favorite = true
|
115
|
+
end
|
116
|
+
|
117
|
+
def pokemons
|
118
|
+
master.pokemons
|
119
|
+
end
|
120
|
+
|
121
|
+
def master
|
122
|
+
@master ||= PokemonMaster.find(master_id)
|
123
|
+
end
|
124
|
+
|
125
|
+
def master_id
|
126
|
+
params.require(:pokemon_master_id)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
```
|
130
|
+
|
79
131
|
## Azeroth::Decorator
|
80
132
|
|
81
133
|
[Decorators](https://www.rubydoc.info/gems/azeroth/Azeroth/Decorator) are
|
data/azeroth.gemspec
CHANGED
@@ -18,32 +18,33 @@ 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.
|
21
|
+
gem.add_runtime_dependency 'activesupport', '~> 5.2.x'
|
22
22
|
gem.add_runtime_dependency 'darthjee-active_ext', '>= 1.3.2'
|
23
|
-
gem.add_runtime_dependency '
|
23
|
+
gem.add_runtime_dependency 'jace', '>= 0.0.3'
|
24
|
+
gem.add_runtime_dependency 'sinclair', '>= 1.6.7'
|
24
25
|
|
25
|
-
gem.add_development_dependency 'actionpack', '5.2.
|
26
|
-
gem.add_development_dependency 'activerecord', '5.2.
|
26
|
+
gem.add_development_dependency 'actionpack', '~> 5.2.x'
|
27
|
+
gem.add_development_dependency 'activerecord', '~> 5.2.x'
|
27
28
|
gem.add_development_dependency 'bundler', '1.16.1'
|
28
29
|
gem.add_development_dependency 'factory_bot', '5.2.0'
|
29
|
-
gem.add_development_dependency 'nokogiri', '1.
|
30
|
+
gem.add_development_dependency 'nokogiri', '1.11.4'
|
30
31
|
gem.add_development_dependency 'pry', '0.12.2'
|
31
32
|
gem.add_development_dependency 'pry-nav', '0.3.0'
|
32
|
-
gem.add_development_dependency 'rails', '5.2.
|
33
|
+
gem.add_development_dependency 'rails', '~> 5.2.x'
|
33
34
|
gem.add_development_dependency 'rails-controller-testing', '1.0.4'
|
34
|
-
gem.add_development_dependency 'rake', '13.0.
|
35
|
-
gem.add_development_dependency 'reek', '
|
35
|
+
gem.add_development_dependency 'rake', '13.0.3'
|
36
|
+
gem.add_development_dependency 'reek', '6.0.3'
|
36
37
|
gem.add_development_dependency 'rspec', '3.9.0'
|
37
|
-
gem.add_development_dependency 'rspec-core', '3.9.
|
38
|
-
gem.add_development_dependency 'rspec-expectations', '3.9.
|
38
|
+
gem.add_development_dependency 'rspec-core', '3.9.3'
|
39
|
+
gem.add_development_dependency 'rspec-expectations', '3.9.4'
|
39
40
|
gem.add_development_dependency 'rspec-mocks', '3.9.1'
|
40
41
|
gem.add_development_dependency 'rspec-rails', '3.9.0'
|
41
|
-
gem.add_development_dependency 'rspec-support', '3.9.
|
42
|
+
gem.add_development_dependency 'rspec-support', '3.9.4'
|
42
43
|
gem.add_development_dependency 'rubocop', '0.80.1'
|
43
44
|
gem.add_development_dependency 'rubocop-rspec', '1.38.1'
|
44
|
-
gem.add_development_dependency 'rubycritic', '4.
|
45
|
+
gem.add_development_dependency 'rubycritic', '4.6.1'
|
45
46
|
gem.add_development_dependency 'simplecov', '0.17.1'
|
46
47
|
gem.add_development_dependency 'sqlite3', '1.4.2'
|
47
|
-
gem.add_development_dependency 'yard', '0.9.
|
48
|
+
gem.add_development_dependency 'yard', '0.9.26'
|
48
49
|
gem.add_development_dependency 'yardstick', '0.9.9'
|
49
50
|
end
|
data/lib/azeroth.rb
CHANGED
data/lib/azeroth/model.rb
CHANGED
@@ -62,6 +62,8 @@ module Azeroth
|
|
62
62
|
#
|
63
63
|
# @return [Azeroth::Options]
|
64
64
|
|
65
|
+
delegate :decorator, to: :options
|
66
|
+
|
65
67
|
# @private
|
66
68
|
#
|
67
69
|
# Returns decorator class for the object
|
@@ -85,7 +87,7 @@ module Azeroth
|
|
85
87
|
# @return [Azeroth::Decorator,DummyDecorator]
|
86
88
|
def calculate_decorator_class
|
87
89
|
return DummyDecorator unless options.decorator
|
88
|
-
return
|
90
|
+
return decorator if decorator.is_a?(Class)
|
89
91
|
|
90
92
|
klass::Decorator
|
91
93
|
rescue NameError
|
data/lib/azeroth/options.rb
CHANGED
@@ -10,10 +10,17 @@ 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,
|
22
|
+
after_save: nil,
|
23
|
+
build_with: nil
|
17
24
|
}.freeze
|
18
25
|
|
19
26
|
with_options DEFAULT_OPTIONS
|
@@ -25,6 +32,20 @@ module Azeroth
|
|
25
32
|
[only].flatten.map(&:to_sym) - [except].flatten.map(&:to_sym)
|
26
33
|
end
|
27
34
|
|
35
|
+
# Returns event dispatcher
|
36
|
+
#
|
37
|
+
# Event dispatcher is responsible for
|
38
|
+
# sending events such as +before_save+
|
39
|
+
# to it's correct calling point
|
40
|
+
#
|
41
|
+
# @return [Jace::Dispatcher]
|
42
|
+
def event_dispatcher(event)
|
43
|
+
Jace::Dispatcher.new(
|
44
|
+
before: try("before_#{event}"),
|
45
|
+
after: try("after_#{event}")
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
28
49
|
# @method only
|
29
50
|
# @api private
|
30
51
|
#
|
@@ -50,5 +71,34 @@ module Azeroth
|
|
50
71
|
# model.as_json
|
51
72
|
#
|
52
73
|
# @return [Decorator,TrueClass,FalseClass]
|
74
|
+
|
75
|
+
# @method before_save
|
76
|
+
# @api private
|
77
|
+
#
|
78
|
+
# Block or method name to be run before save
|
79
|
+
#
|
80
|
+
# The given method or block will be ran
|
81
|
+
# before committing changes in models
|
82
|
+
# to database
|
83
|
+
#
|
84
|
+
# @return [Symbol,Proc]
|
85
|
+
|
86
|
+
# @method after_save
|
87
|
+
# @api private
|
88
|
+
#
|
89
|
+
# Block or method name to be run after save
|
90
|
+
#
|
91
|
+
# The given method or block will be ran
|
92
|
+
# after committing changes in models
|
93
|
+
# to database
|
94
|
+
#
|
95
|
+
# @return [Symbol,Proc]
|
96
|
+
|
97
|
+
# @method build_with
|
98
|
+
# @api private
|
99
|
+
#
|
100
|
+
# Block or method name to be ran when building the resource
|
101
|
+
#
|
102
|
+
# @return [Symbol,Proc]
|
53
103
|
end
|
54
104
|
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
|
@@ -8,6 +8,8 @@ module Azeroth
|
|
8
8
|
class Create < RequestHandler
|
9
9
|
private
|
10
10
|
|
11
|
+
delegate :build_with, to: :options
|
12
|
+
|
11
13
|
# @private
|
12
14
|
#
|
13
15
|
# Creates and return an instance of the model
|
@@ -17,16 +19,40 @@ module Azeroth
|
|
17
19
|
#
|
18
20
|
# @return [Object]
|
19
21
|
def resource
|
20
|
-
@resource ||=
|
22
|
+
@resource ||= build_and_save_resource
|
21
23
|
end
|
22
24
|
|
23
|
-
#
|
25
|
+
# @private
|
26
|
+
#
|
27
|
+
# build resource for create and save it
|
24
28
|
#
|
25
29
|
# @return [Object]
|
30
|
+
def build_and_save_resource
|
31
|
+
@resource = build_resource
|
32
|
+
controller.instance_variable_set("@#{model.name}", resource)
|
33
|
+
|
34
|
+
trigger_event(:save) do
|
35
|
+
resource.tap(&:save)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# @private
|
40
|
+
#
|
41
|
+
# build resource without saving it
|
42
|
+
#
|
43
|
+
# when +build_with+ option is given, the proc/method
|
44
|
+
# is called instead of collection.build
|
45
|
+
#
|
46
|
+
# @return [Object] resource built
|
26
47
|
def build_resource
|
27
|
-
|
28
|
-
|
29
|
-
|
48
|
+
return collection.build(attributes) unless build_with
|
49
|
+
|
50
|
+
case build_with
|
51
|
+
when Proc
|
52
|
+
controller.instance_eval(&build_with)
|
53
|
+
else
|
54
|
+
controller.send(build_with)
|
55
|
+
end
|
30
56
|
end
|
31
57
|
|
32
58
|
# @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
|
-
|
28
|
+
trigger_event(:save) do
|
29
|
+
entry.update(attributes)
|
30
|
+
end
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|