eitil 1.4.1 → 2.0.0
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/eitil_wrapper/README.md +0 -38
- data/eitil_wrapper/lib/eitil_wrapper.rb +0 -1
- data/lib/eitil/version.rb +1 -1
- data/spec/dummy_app/app/controllers/application_controller.rb +0 -2
- data/spec/dummy_app/app/controllers/users_controller.rb +0 -31
- data/spec/dummy_app/config/routes.rb +0 -5
- data/spec/dummy_app/db/test.sqlite3 +0 -0
- metadata +2 -9
- data/eitil_wrapper/lib/eitil_wrapper/decorators/application_decorator.rb +0 -22
- data/eitil_wrapper/lib/eitil_wrapper/decorators/controller_decorator.rb +0 -72
- data/eitil_wrapper/lib/eitil_wrapper/decorators.rb +0 -3
- data/spec/dummy_app/app/decorators/address_decorator.rb +0 -3
- data/spec/dummy_app/app/decorators/application_decorator.rb +0 -12
- data/spec/dummy_app/app/decorators/user_decorator.rb +0 -19
- data/spec/eitil_wrapper/decorators/decorators_spec.rb +0 -49
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fac708d7cfe133d03e39c0606ca98572f8ca1f2dfb490ca872d68fb49b5f054a
|
4
|
+
data.tar.gz: 0bf381608da0aaeb140e73e1819a2a5b2f155e6157ab326645b8f8378c2f6f54
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 241e2a5baf494d84d0f2400e06382bbd57d6488b540a68de0eec14c31fe865984dfefff828864e4c816960df303f94f00e4f988c2aec0fc4ce1762b58c156c94
|
7
|
+
data.tar.gz: 1309197e2d0bbea822aa36aaec692ed9e903c053eb48130c9d888ddd19aca7632cf15a78d76ca71de7f0cadb89e16dc28fd3ae0cb4e3eaf78601fea07d183e77
|
data/eitil_wrapper/README.md
CHANGED
@@ -37,44 +37,6 @@ Callback helper methods are created for use within a model's callbacks. You can
|
|
37
37
|
|
38
38
|
|
39
39
|
|
40
|
-
## EitilWrapper::Decorators
|
41
|
-
|
42
|
-
```ruby
|
43
|
-
|
44
|
-
require "eitil_wrapper/decorators"
|
45
|
-
|
46
|
-
```
|
47
|
-
|
48
|
-
The Eitil decorator wrappers help you to standardize the calling of the right decorator method from within your controller action. Basically it provides you with a decorate macro in each controller.
|
49
|
-
|
50
|
-
```ruby
|
51
|
-
decorate(dec_item, dec_method: nil, dec_class: nil, **dec_kwargs)
|
52
|
-
```
|
53
|
-
|
54
|
-
- dec_item is the instance that will be decorated
|
55
|
-
- dec_method enabled you to set the desired decorator method. If not provided, it will look into the request params: if params["isMobile"] is present it will call .app, if params["isWeb"] is present it will call :app. If neither is provided in the params, it will call the default method :base.
|
56
|
-
- dec_class enables you to overwrite the decorator class that will be called. If not provided, the decorator class will be inferred from the instance model's classname (User => UserDecorator).
|
57
|
-
- dec_kwargs enables you to provide additional arguments, which will be passed to your decorator method.
|
58
|
-
|
59
|
-
|
60
|
-
### Configuration
|
61
|
-
|
62
|
-
1. Your decorator classes should inherit from EitilWrapper::ApplicationDecorator.
|
63
|
-
2. Your controllers should inherit the module EitilWrapper::ControllerDecorator, through inclusion in a superclass.
|
64
|
-
3. If you set controller ivars for each request, you can make them available in your decorators by providing Eitil with the names of your ivars as an array of symbols:
|
65
|
-
|
66
|
-
```ruby
|
67
|
-
# initializers/eitil.rb
|
68
|
-
|
69
|
-
Eitil.set_config do |config|
|
70
|
-
config.controller_ivars = [:user, :env]
|
71
|
-
end
|
72
|
-
```
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
40
|
## EitilWrapper::Jobs
|
79
41
|
|
80
42
|
```ruby
|
data/lib/eitil/version.rb
CHANGED
@@ -3,37 +3,6 @@ class UsersController < ApplicationController
|
|
3
3
|
before_action :set_user, only: [:show, :edit, :update, :destroy]
|
4
4
|
|
5
5
|
|
6
|
-
# ---
|
7
|
-
# Tests for EitilWrapper::Decorator
|
8
|
-
|
9
|
-
before_action :set_user, only: [:decorator_a, :decorator_b, :decorator_c, :decorator_d]
|
10
|
-
|
11
|
-
# default
|
12
|
-
def decorator_a
|
13
|
-
hash = decorate(@user)
|
14
|
-
render json: hash
|
15
|
-
end
|
16
|
-
|
17
|
-
# specific dec_method
|
18
|
-
def decorator_b
|
19
|
-
hash = decorate(@user, dec_method: :first_and_last_name)
|
20
|
-
render json: hash
|
21
|
-
end
|
22
|
-
|
23
|
-
# post request, with 'isWeb' and 'isMobile' params
|
24
|
-
def decorator_c
|
25
|
-
hash = decorate(@user)
|
26
|
-
render json: hash
|
27
|
-
end
|
28
|
-
|
29
|
-
# specific dec_class
|
30
|
-
def decorator_d
|
31
|
-
hash = decorate(@user, dec_class: :Application, dec_method: :timestamps)
|
32
|
-
render json: hash
|
33
|
-
end
|
34
|
-
|
35
|
-
# ---
|
36
|
-
|
37
6
|
|
38
7
|
|
39
8
|
# GET /users
|
@@ -4,9 +4,4 @@ Rails.application.routes.draw do
|
|
4
4
|
resources :addresses
|
5
5
|
resources :users
|
6
6
|
|
7
|
-
get 'users/:id/decorator_a' => 'users#decorator_a'
|
8
|
-
get 'users/:id/decorator_b' => 'users#decorator_b'
|
9
|
-
post 'users/:id/decorator_c' => 'users#decorator_c'
|
10
|
-
get 'users/:id/decorator_d' => 'users#decorator_d'
|
11
|
-
|
12
7
|
end
|
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eitil
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jurriaan Schrofer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-10-
|
11
|
+
date: 2021-10-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -275,9 +275,6 @@ files:
|
|
275
275
|
- eitil_wrapper/lib/eitil_wrapper.rb
|
276
276
|
- eitil_wrapper/lib/eitil_wrapper/callbacks.rb
|
277
277
|
- eitil_wrapper/lib/eitil_wrapper/callbacks/helper_methods.rb
|
278
|
-
- eitil_wrapper/lib/eitil_wrapper/decorators.rb
|
279
|
-
- eitil_wrapper/lib/eitil_wrapper/decorators/application_decorator.rb
|
280
|
-
- eitil_wrapper/lib/eitil_wrapper/decorators/controller_decorator.rb
|
281
278
|
- eitil_wrapper/lib/eitil_wrapper/jobs.rb
|
282
279
|
- eitil_wrapper/lib/eitil_wrapper/jobs/new_job.rb
|
283
280
|
- eitil_wrapper/lib/eitil_wrapper/jobs/new_job_now.rb
|
@@ -309,9 +306,6 @@ files:
|
|
309
306
|
- spec/dummy_app/app/controllers/addresses_controller.rb
|
310
307
|
- spec/dummy_app/app/controllers/application_controller.rb
|
311
308
|
- spec/dummy_app/app/controllers/users_controller.rb
|
312
|
-
- spec/dummy_app/app/decorators/address_decorator.rb
|
313
|
-
- spec/dummy_app/app/decorators/application_decorator.rb
|
314
|
-
- spec/dummy_app/app/decorators/user_decorator.rb
|
315
309
|
- spec/dummy_app/app/helpers/addresses_helper.rb
|
316
310
|
- spec/dummy_app/app/helpers/application_helper.rb
|
317
311
|
- spec/dummy_app/app/helpers/users_helper.rb
|
@@ -444,7 +438,6 @@ files:
|
|
444
438
|
- spec/eitil_integrate/application_exporter/auto_sum_spec.rb
|
445
439
|
- spec/eitil_integrate/application_exporter/initialize_spec.rb
|
446
440
|
- spec/eitil_wrapper/callbacks/helper_methods_spec.rb
|
447
|
-
- spec/eitil_wrapper/decorators/decorators_spec.rb
|
448
441
|
- spec/eitil_wrapper/jobs/single_method_job_spec.rb
|
449
442
|
- spec/eitil_wrapper/routes/extended_resources_spec.rb
|
450
443
|
- spec/eitil_wrapper/scopes/default_scopes_spec.rb
|
@@ -1,22 +0,0 @@
|
|
1
|
-
|
2
|
-
require "active_model/railtie"
|
3
|
-
|
4
|
-
module EitilWrapper
|
5
|
-
class ApplicationDecorator
|
6
|
-
|
7
|
-
include ActiveModel::Model
|
8
|
-
|
9
|
-
def initialize(attributes={}, **kwargs)
|
10
|
-
super attributes
|
11
|
-
all_kwargs_to_ivars binding
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.method_missing(method_name, *args, **kwargs)
|
15
|
-
if %i$ web app $.include?(method_name.to_sym)
|
16
|
-
kwargs.any? ? send(:base, *args, **kwargs) : send(:base, *args)
|
17
|
-
end
|
18
|
-
super
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|
22
|
-
end
|
@@ -1,72 +0,0 @@
|
|
1
|
-
module EitilWrapper
|
2
|
-
module ControllerDecorator
|
3
|
-
|
4
|
-
private
|
5
|
-
|
6
|
-
def decorate(dec_item, dec_method: nil, dec_class: nil, **dec_kwargs)
|
7
|
-
all_args_to_ivars binding
|
8
|
-
set_ivars :dec_class, :decorator, :dec_method
|
9
|
-
send_to_decorator
|
10
|
-
|
11
|
-
rescue NameError => e
|
12
|
-
puts "EitilWrapper::ControllerDecorator => rescuing uninitialised constant #{e.name}, returning the object's default JSON instead."
|
13
|
-
return dec_item.as_json
|
14
|
-
end
|
15
|
-
|
16
|
-
def send_to_decorator
|
17
|
-
@decorator.send(@dec_method, @dec_item)
|
18
|
-
|
19
|
-
rescue NoMethodError => e
|
20
|
-
inform_no_method_for_decorator_error
|
21
|
-
@dec_item
|
22
|
-
end
|
23
|
-
|
24
|
-
def inform_no_method_for_decorator_error
|
25
|
-
message = "Warning: NoMethodError for #{@dec_class}##{@dec_method}, returned @dec_item instead."
|
26
|
-
Logger.new("#{Rails.root}/log/decorator_log.log").warn message
|
27
|
-
warn message
|
28
|
-
end
|
29
|
-
|
30
|
-
def set_dec_method
|
31
|
-
@dec_method = @dec_method || derived_dec_method || :base
|
32
|
-
end
|
33
|
-
|
34
|
-
def derived_dec_method
|
35
|
-
return unless respond_to? :params
|
36
|
-
return :app if @decorator.respond_to?(:app) && params["isMobile"]
|
37
|
-
return :web if @decorator.respond_to?(:web) && params["isWeb"]
|
38
|
-
end
|
39
|
-
|
40
|
-
def set_dec_class
|
41
|
-
@dec_class = @dec_class ? manual_set_dec_class : derived_dec_class
|
42
|
-
end
|
43
|
-
|
44
|
-
def manual_set_dec_class
|
45
|
-
"#{@dec_class}Decorator".constantize
|
46
|
-
end
|
47
|
-
|
48
|
-
def derived_dec_class
|
49
|
-
"#{@dec_item.class.name}Decorator".constantize
|
50
|
-
end
|
51
|
-
|
52
|
-
def set_decorator
|
53
|
-
@dec_class.new **ivars
|
54
|
-
end
|
55
|
-
|
56
|
-
# Converts the controller_ivars, given in your main application's configuration,
|
57
|
-
# into an hash. If no controller_ivars, continue with converting, in order to avoid
|
58
|
-
# issues due to differing data types.
|
59
|
-
def controller_ivars
|
60
|
-
return {} unless Eitil.controller_ivars.any?
|
61
|
-
|
62
|
-
Eitil.controller_ivars.map do |ivar|
|
63
|
-
{ ivar => instance_variable_get("@#{ivar.to_s}") }
|
64
|
-
end.inject &:merge
|
65
|
-
end
|
66
|
-
|
67
|
-
def ivars
|
68
|
-
@dec_kwargs.any? ? controller_ivars.merge(@dec_kwargs) : controller_ivars
|
69
|
-
end
|
70
|
-
|
71
|
-
end
|
72
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
class UserDecorator < ApplicationDecorator
|
2
|
-
|
3
|
-
def first_and_last_name(user)
|
4
|
-
user.slice(:first_name, :last_name)
|
5
|
-
end
|
6
|
-
|
7
|
-
def app(user)
|
8
|
-
user.slice(:phone, :email)
|
9
|
-
end
|
10
|
-
|
11
|
-
def web(user)
|
12
|
-
user.slice(:age, :wage)
|
13
|
-
end
|
14
|
-
|
15
|
-
def base(user)
|
16
|
-
user.as_json
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
|
2
|
-
RSpec.describe "EitilWrapper::Decorators" do
|
3
|
-
|
4
|
-
include Rack::Test::Methods
|
5
|
-
|
6
|
-
let(:user) { User.create(first_name: 'slim', last_name: 'shady') }
|
7
|
-
|
8
|
-
def body(endpoint)
|
9
|
-
@body ||= JSON.parse(get("/users/#{user.id}/#{endpoint}").body)
|
10
|
-
end
|
11
|
-
|
12
|
-
it "should respond to a request" do
|
13
|
-
response = get "/users/#{user.id}/decorator_a"
|
14
|
-
expect(response).to be_a Rack::MockResponse
|
15
|
-
end
|
16
|
-
|
17
|
-
it "should, by default, return all of a records' columns" do
|
18
|
-
response_keys = body(:decorator_a).keys.map(&:to_sym)
|
19
|
-
table_columns = [:id, :created_at, :updated_at, :first_name, :last_name, :email, :birthday, :phone, :confirmed, :last_sign_in, :age, :wage]
|
20
|
-
expect(table_columns.all? { |column| response_keys.include?(column) }).to be_truthy
|
21
|
-
end
|
22
|
-
|
23
|
-
it "should, if a specific decorator method is passed, return that method's value" do
|
24
|
-
response_keys = body(:decorator_b).keys.map(&:to_sym)
|
25
|
-
decorator_keys = [:first_name, :last_name]
|
26
|
-
expect(response_keys).to eq decorator_keys
|
27
|
-
end
|
28
|
-
|
29
|
-
it "should, if no decorator method is passed, but param['isMobile'] is present, return the :app method's value" do
|
30
|
-
response = post "/users/#{user.id}/decorator_c", { "isMobile" => true }
|
31
|
-
response_keys = JSON.parse(response.body).keys.map(&:to_sym)
|
32
|
-
decorator_keys = [:phone, :email]
|
33
|
-
expect(response_keys).to eq decorator_keys
|
34
|
-
end
|
35
|
-
|
36
|
-
it "should, if no decorator method is passed, but param['isWeb'] is present, return the :web method's value" do
|
37
|
-
response = post "/users/#{user.id}/decorator_c", { "isWeb" => true }
|
38
|
-
response_keys = JSON.parse(response.body).keys.map(&:to_sym)
|
39
|
-
decorator_keys = [:age, :wage]
|
40
|
-
expect(response_keys).to eq decorator_keys
|
41
|
-
end
|
42
|
-
|
43
|
-
it "should, if a decorator class is passed, return the value of that class' method" do
|
44
|
-
response_keys = body(:decorator_d).keys.map(&:to_sym)
|
45
|
-
decorator_keys = [:created_at, :updated_at]
|
46
|
-
expect(response_keys).to eq decorator_keys
|
47
|
-
end
|
48
|
-
|
49
|
-
end
|