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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bacab45470fdf4298f45f3398971182ff8a3dc415bbda98e9e7132c44e18f09c
4
- data.tar.gz: 82e3fdd78814fb17045ff2a83e9274ddab88bc7c56ba90592ff2342b2d91fec8
3
+ metadata.gz: b1eb7847183ec4abaa2225794008dd89c712a50d1f12c81fce975f68c481060a
4
+ data.tar.gz: ed59804cb8dd17c36044cf9e4a958daee9f0e713d49497190dbfa6a276dbe3bd
5
5
  SHA512:
6
- metadata.gz: abd873b2c39063346d482a5a641bfdcb99788463f32864e461bee9d2a12833f62e3e24e2bd0c05fc26a941be5bfedf3852017704f9c29bb68589b3e07e22f88d
7
- data.tar.gz: 9ed1436c5a992ebf296c81ff0d646bff8280ae78cfba052fa012a6ff5db173b41501a89b57c1343a92491483ccf17bb7a6dfb53989b83401a83e1bba01c4d009
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(&parameter)
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.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: