hola_dmleobit 0.0.0 → 0.0.1
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/lib/findable/definition.rb +58 -0
- data/lib/findable/find.rb +64 -0
- data/lib/findable/finder.rb +81 -0
- data/lib/findable/strategies/friendly_id.rb +54 -0
- data/lib/hola_dmleobit.rb +36 -0
- metadata +5 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b1eb7847183ec4abaa2225794008dd89c712a50d1f12c81fce975f68c481060a
|
4
|
+
data.tar.gz: ed59804cb8dd17c36044cf9e4a958daee9f0e713d49497190dbfa6a276dbe3bd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f616f4a105afdcae870aab97cca71f7caec6327b200a0c6f66ce381047c3a2597fb9f9a6fff0b649c2da87684a425a45348ac3ad1c274ad21282409f8b8d9364
|
7
|
+
data.tar.gz: c40eb1baa298de4b3cbfda9db63145b70de6908fc1a69ac1291e1b0dbe1491406251a5ba2a0f3c0e1c20c027375901486a98f2b208ca0f3da78c4e279e73ca88
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'findable/finder'
|
3
|
+
|
4
|
+
|
5
|
+
module Findable
|
6
|
+
class Definition
|
7
|
+
ONLY_KEYWORD = 'only'
|
8
|
+
EXCEPT_KEYWORD = 'except'
|
9
|
+
|
10
|
+
attr_reader :resource_name, :params
|
11
|
+
|
12
|
+
def initialize(controller:, resource_name:, **params)
|
13
|
+
@controller = controller
|
14
|
+
@resource_name = resource_name
|
15
|
+
@params = params
|
16
|
+
@only = params.delete(:only)
|
17
|
+
@except = params.delete(:except)
|
18
|
+
end
|
19
|
+
|
20
|
+
def call
|
21
|
+
this = self
|
22
|
+
|
23
|
+
controller.define_method(finder_name) do
|
24
|
+
resource = ::Findable::Finder.new(controller: self,
|
25
|
+
resource_name: this.resource_name,
|
26
|
+
**this.params).call
|
27
|
+
instance_variable_set("@#{this.resource_name}", resource)
|
28
|
+
end
|
29
|
+
|
30
|
+
controller.before_action(finder_name, action_params)
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
attr_reader :controller, :only, :except
|
36
|
+
|
37
|
+
def finder_name
|
38
|
+
@finder_name ||=
|
39
|
+
"find_#{resource_name}#{only_suffix}#{except_suffix}!".to_sym
|
40
|
+
end
|
41
|
+
|
42
|
+
def only_suffix
|
43
|
+
return if only.blank?
|
44
|
+
|
45
|
+
"_#{ONLY_KEYWORD}_#{Array(only).join('_')}"
|
46
|
+
end
|
47
|
+
|
48
|
+
def except_suffix
|
49
|
+
return if except.blank?
|
50
|
+
|
51
|
+
"_#{EXCEPT_KEYWORD}_#{Array(except).join('_')}"
|
52
|
+
end
|
53
|
+
|
54
|
+
def action_params
|
55
|
+
{ only: only, except: except }.compact
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'findable/strategies/friendly_id'
|
4
|
+
|
5
|
+
module Findable
|
6
|
+
class Find
|
7
|
+
include Strategies::FriendlyId
|
8
|
+
|
9
|
+
def initialize(resource_class:, **params)
|
10
|
+
@resource_class = resource_class
|
11
|
+
@value = params[:value]
|
12
|
+
@attribute = params.fetch(:attribute, :id)
|
13
|
+
@strict = params.fetch(:strict, true)
|
14
|
+
@eager_load = params[:eager_load]
|
15
|
+
@preload = params[:preload]
|
16
|
+
@joins = params[:joins]
|
17
|
+
@friendly = params[:friendly]
|
18
|
+
end
|
19
|
+
|
20
|
+
def call
|
21
|
+
constantize_resource_class!
|
22
|
+
verify_strategies!
|
23
|
+
find_resource!
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
attr_reader :resource_class, :value, :attribute, :strict,
|
29
|
+
:eager_load, :preload, :joins, :friendly,
|
30
|
+
:constantized_resource_class
|
31
|
+
|
32
|
+
def constantize_resource_class!
|
33
|
+
@constantized_resource_class = resource_class.to_s.constantize
|
34
|
+
rescue NameError
|
35
|
+
raise NameError, invalid_resource_class_message
|
36
|
+
end
|
37
|
+
|
38
|
+
def invalid_resource_class_message
|
39
|
+
"You haven't defined such resource class: `#{resource_class}`."
|
40
|
+
end
|
41
|
+
|
42
|
+
def verify_strategies!
|
43
|
+
verify_friendly_id_strategy!
|
44
|
+
end
|
45
|
+
|
46
|
+
def find_resource!
|
47
|
+
constantized_resource_class
|
48
|
+
.eager_load(eager_load)
|
49
|
+
.preload(preload)
|
50
|
+
.joins(joins)
|
51
|
+
.yield_self(&method(:apply_search_strategy!))
|
52
|
+
end
|
53
|
+
|
54
|
+
def apply_search_strategy!(scope)
|
55
|
+
return apply_friendly_id_strategy!(scope) if friendly
|
56
|
+
|
57
|
+
constantized_resource_class.send(finder_method, attribute => value)
|
58
|
+
end
|
59
|
+
|
60
|
+
def finder_method
|
61
|
+
strict ? :find_by! : :find_by
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'findable/find'
|
4
|
+
|
5
|
+
module Findable
|
6
|
+
class Finder
|
7
|
+
|
8
|
+
def initialize(controller:, resource_name:, **params)
|
9
|
+
@controller = controller
|
10
|
+
@resource_name = resource_name
|
11
|
+
@resource_class = params.fetch(:class) { default_resource_class }
|
12
|
+
@by = params.fetch(:by, :id)
|
13
|
+
@attribute = params.fetch(:attribute, :id)
|
14
|
+
@strict = params.fetch(:strict, true)
|
15
|
+
@decorate = params.fetch(:decorate, false)
|
16
|
+
@friendly = params[:friendly]
|
17
|
+
@fallback_parameter = params[:fallback]
|
18
|
+
@fallback_value_parameter = params[:fallback_value]
|
19
|
+
@options = params
|
20
|
+
end
|
21
|
+
|
22
|
+
def call
|
23
|
+
return fallback(fallback_parameter) unless resource
|
24
|
+
|
25
|
+
decorate? ? resource.decorate : resource
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
attr_reader :controller, :resource_name, :resource_class,
|
31
|
+
:by, :attribute, :strict, :fallback_parameter,
|
32
|
+
:fallback_value_parameter, :options, :decorate,
|
33
|
+
:friendly
|
34
|
+
alias_method :decorate?, :decorate
|
35
|
+
|
36
|
+
def eager_load
|
37
|
+
@eager_load ||= options[:eager_load]
|
38
|
+
end
|
39
|
+
|
40
|
+
def preload
|
41
|
+
@preload ||= options[:preload]
|
42
|
+
end
|
43
|
+
|
44
|
+
def joins
|
45
|
+
@joins ||= options[:joins]
|
46
|
+
end
|
47
|
+
|
48
|
+
def default_resource_class
|
49
|
+
resource_name.to_s.camelcase
|
50
|
+
end
|
51
|
+
|
52
|
+
def resource
|
53
|
+
::Findable::Find.new(
|
54
|
+
resource_class: resource_class,
|
55
|
+
value: value,
|
56
|
+
attribute: attribute,
|
57
|
+
strict: strict?,
|
58
|
+
eager_load: eager_load,
|
59
|
+
preload: preload,
|
60
|
+
joins: joins,
|
61
|
+
friendly: friendly
|
62
|
+
).call
|
63
|
+
end
|
64
|
+
|
65
|
+
def value
|
66
|
+
controller.params.dig(*by) || fallback(fallback_value_parameter)
|
67
|
+
end
|
68
|
+
|
69
|
+
def fallback(parameter)
|
70
|
+
case parameter
|
71
|
+
when Symbol then controller.send(parameter)
|
72
|
+
when Proc then controller.instance_exec(¶meter)
|
73
|
+
else parameter
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def strict?
|
78
|
+
fallback_parameter.blank? && strict.present?
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Findable
|
4
|
+
module Strategies
|
5
|
+
module FriendlyId
|
6
|
+
protected
|
7
|
+
|
8
|
+
def strict
|
9
|
+
raise "##{__method__} should be defined!"
|
10
|
+
end
|
11
|
+
|
12
|
+
def value
|
13
|
+
raise "##{__method__} should be defined!"
|
14
|
+
end
|
15
|
+
|
16
|
+
def friendly
|
17
|
+
raise "##{__method__} should be defined!"
|
18
|
+
end
|
19
|
+
|
20
|
+
def constantized_resource_class
|
21
|
+
raise "##{__method__} should be defined!"
|
22
|
+
end
|
23
|
+
|
24
|
+
def verify_friendly_id_strategy!
|
25
|
+
return unless friendly
|
26
|
+
return no_friendly_id_gem! unless defined?(::FriendlyId)
|
27
|
+
|
28
|
+
no_friendly_id_model! unless friendly_id_model?
|
29
|
+
end
|
30
|
+
|
31
|
+
def apply_friendly_id_strategy!(scope)
|
32
|
+
scope.friendly.find(value)
|
33
|
+
rescue ActiveRecord::RecordNotFound => e
|
34
|
+
raise e if strict
|
35
|
+
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def no_friendly_id_gem!
|
42
|
+
raise 'Add FriendlyId gem to your bundle to use `friendly` option!'
|
43
|
+
end
|
44
|
+
|
45
|
+
def friendly_id_model?
|
46
|
+
constantized_resource_class.method_defined?(:friendly_id)
|
47
|
+
end
|
48
|
+
|
49
|
+
def no_friendly_id_model!
|
50
|
+
raise 'Enable FriendlyId to your model to use `friendly` option!'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/lib/hola_dmleobit.rb
CHANGED
@@ -3,3 +3,39 @@ class HolaDmleobit
|
|
3
3
|
puts "Hello world!"
|
4
4
|
end
|
5
5
|
end
|
6
|
+
|
7
|
+
require 'findable'
|
8
|
+
require 'findable/definition'
|
9
|
+
|
10
|
+
|
11
|
+
# module Findable
|
12
|
+
# extend ActiveSupport::Concern
|
13
|
+
|
14
|
+
# class_methods do
|
15
|
+
# # resource_name - name of instance variable where found resource will be placed
|
16
|
+
# # options includes:
|
17
|
+
# # - class - name of resource class (default: taken from resource_name)
|
18
|
+
# # - by - how value is named in params (default: :id)
|
19
|
+
# # - attribute - name of resource attribute (default: :id)
|
20
|
+
# # - strict - raise error if resource hasn't been found (default: true)
|
21
|
+
# # - fallback - method name/proc which we call if resource hasn't been found
|
22
|
+
# # - fallback_value - method name/proc which we call if value can't be found in params
|
23
|
+
# # - only - list of controller actions on which it is triggered
|
24
|
+
# # - except - list of controller actions on which it isn't triggered
|
25
|
+
# # - eager_load - list of eager loaded entries to avoid N+1 problem
|
26
|
+
# # - preload - list of preloaded entries to avoid N+1 problem
|
27
|
+
# # - joins - list of joined entries to avoid N+1 problem
|
28
|
+
# # - decorate - shows if we should decorate found resource.
|
29
|
+
# # Can be used only with respective Drapper decorator
|
30
|
+
# # - friendly - shows if we should find resource also by slug field.
|
31
|
+
# # Can be used only for FriendlyId models.
|
32
|
+
# #
|
33
|
+
# def find(resource_name, **options)
|
34
|
+
# ::Findable::Definition.call(
|
35
|
+
# controller: self,
|
36
|
+
# resource_name: resource_name,
|
37
|
+
# **options
|
38
|
+
# )
|
39
|
+
# end
|
40
|
+
# end
|
41
|
+
# end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hola_dmleobit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Quaranto
|
@@ -16,6 +16,10 @@ executables: []
|
|
16
16
|
extensions: []
|
17
17
|
extra_rdoc_files: []
|
18
18
|
files:
|
19
|
+
- lib/findable/definition.rb
|
20
|
+
- lib/findable/find.rb
|
21
|
+
- lib/findable/finder.rb
|
22
|
+
- lib/findable/strategies/friendly_id.rb
|
19
23
|
- lib/hola_dmleobit.rb
|
20
24
|
homepage: https://rubygems.org/gems/hola
|
21
25
|
licenses:
|