snfoil 0.8.3 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +201 -0
- data/README.md +95 -505
- data/docs/build-context.md +56 -0
- data/docs/create-context.md +109 -0
- data/docs/destroy-context.md +102 -0
- data/docs/index-context.md +70 -0
- data/docs/show-context.md +71 -0
- data/docs/update-context.md +107 -0
- data/lib/{sn_foil → snfoil}/adapters/orms/active_record.rb +14 -0
- data/lib/{sn_foil → snfoil}/adapters/orms/base_adapter.rb +14 -0
- data/lib/snfoil/crud/build_context.rb +49 -0
- data/lib/snfoil/crud/change_context.rb +48 -0
- data/lib/snfoil/crud/context.rb +41 -0
- data/lib/snfoil/crud/create_context.rb +45 -0
- data/lib/snfoil/crud/destroy_context.rb +57 -0
- data/lib/snfoil/crud/index_context.rb +46 -0
- data/lib/snfoil/crud/setup_context.rb +90 -0
- data/lib/snfoil/crud/show_context.rb +52 -0
- data/lib/snfoil/crud/update_context.rb +60 -0
- data/lib/snfoil/version.rb +19 -0
- data/lib/snfoil.rb +69 -0
- data/snfoil.gemspec +47 -0
- metadata +99 -32
- data/Rakefile +0 -4
- data/lib/sn_foil/context.rb +0 -24
- data/lib/sn_foil/contexts/build_context.rb +0 -67
- data/lib/sn_foil/contexts/change_context.rb +0 -101
- data/lib/sn_foil/contexts/create_context.rb +0 -158
- data/lib/sn_foil/contexts/destroy_context.rb +0 -164
- data/lib/sn_foil/contexts/index_context.rb +0 -64
- data/lib/sn_foil/contexts/setup_context.rb +0 -119
- data/lib/sn_foil/contexts/show_context.rb +0 -61
- data/lib/sn_foil/contexts/update_context.rb +0 -168
- data/lib/sn_foil/policy.rb +0 -55
- data/lib/sn_foil/searcher.rb +0 -123
- data/lib/sn_foil/version.rb +0 -5
- data/lib/sn_foil.rb +0 -49
data/lib/sn_foil/searcher.rb
DELETED
@@ -1,123 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'active_support/concern'
|
4
|
-
|
5
|
-
module SnFoil
|
6
|
-
module Searcher
|
7
|
-
extend ActiveSupport::Concern
|
8
|
-
|
9
|
-
class_methods do
|
10
|
-
attr_reader :i_model, :i_setup, :i_filters, :i_search_step, :i_booleans
|
11
|
-
|
12
|
-
def model(klass = nil)
|
13
|
-
@i_model = klass
|
14
|
-
end
|
15
|
-
|
16
|
-
def setup(setup_method = nil, &setup_block)
|
17
|
-
@i_setup = setup_method || setup_block
|
18
|
-
end
|
19
|
-
|
20
|
-
def filter(method = nil, **options, &block)
|
21
|
-
raise ArgumentError, 'filter requires either a method name or a block' if method.nil? && block.nil?
|
22
|
-
|
23
|
-
(@i_filters ||= []) << {
|
24
|
-
method: method,
|
25
|
-
block: block,
|
26
|
-
if: options[:if],
|
27
|
-
unless: options[:unless]
|
28
|
-
}
|
29
|
-
end
|
30
|
-
|
31
|
-
def booleans(*fields)
|
32
|
-
@i_booleans ||= []
|
33
|
-
@i_booleans |= fields.map(&:to_sym)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def model
|
38
|
-
self.class.i_model
|
39
|
-
end
|
40
|
-
|
41
|
-
attr_reader :scope
|
42
|
-
|
43
|
-
def initialize(scope: nil)
|
44
|
-
@scope = scope || model.all
|
45
|
-
end
|
46
|
-
|
47
|
-
def search(params = {})
|
48
|
-
params = transform_params_booleans(params) # this is required for params coming in from http-like sources
|
49
|
-
filtered_scope = filter || scope # start usimg the default scope of the class or the filter method
|
50
|
-
filtered_scope = apply_setup(filtered_scope, params)
|
51
|
-
apply_filters(filtered_scope, params)
|
52
|
-
end
|
53
|
-
|
54
|
-
def filter; end
|
55
|
-
|
56
|
-
def setup
|
57
|
-
self.class.i_setup
|
58
|
-
end
|
59
|
-
|
60
|
-
def filters
|
61
|
-
self.class.i_filters || []
|
62
|
-
end
|
63
|
-
|
64
|
-
def booleans
|
65
|
-
self.class.i_booleans || []
|
66
|
-
end
|
67
|
-
|
68
|
-
private
|
69
|
-
|
70
|
-
def apply_setup(filtered_scope, params)
|
71
|
-
return filtered_scope if setup.nil?
|
72
|
-
|
73
|
-
if setup.is_a?(Symbol) || setup.is_a?(String)
|
74
|
-
send(setup, filtered_scope, params)
|
75
|
-
else
|
76
|
-
instance_exec filtered_scope, params, &setup
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
def apply_filters(filtered_scope, params)
|
81
|
-
filters&.reduce(filtered_scope) do |i_scope, i_filter|
|
82
|
-
apply_filter(i_filter, i_scope, params)
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
def apply_filter(i_filter, filtered_scope, params)
|
87
|
-
return filtered_scope unless filter_valid?(i_filter, params)
|
88
|
-
|
89
|
-
return send(i_filter[:method], filtered_scope, params) if i_filter[:method]
|
90
|
-
|
91
|
-
instance_exec filtered_scope, params, &i_filter[:block]
|
92
|
-
end
|
93
|
-
|
94
|
-
def filter_valid?(i_filter, params)
|
95
|
-
return false if !i_filter[:if].nil? && i_filter[:if].call(params) == false
|
96
|
-
return false if !i_filter[:unless].nil? && i_filter[:unless].call(params) == true
|
97
|
-
|
98
|
-
true
|
99
|
-
end
|
100
|
-
|
101
|
-
def transform_params_booleans(params)
|
102
|
-
params.map do |key, value|
|
103
|
-
value = if booleans.include?(key.to_sym)
|
104
|
-
value_to_boolean(value)
|
105
|
-
else
|
106
|
-
value
|
107
|
-
end
|
108
|
-
[key, value]
|
109
|
-
end.to_h
|
110
|
-
end
|
111
|
-
|
112
|
-
def value_to_boolean(value)
|
113
|
-
string_val = value.to_s
|
114
|
-
if value == true || %w[true 1].include?(string_val)
|
115
|
-
true
|
116
|
-
elsif value == false || %w[false 0].include?(string_val)
|
117
|
-
false
|
118
|
-
else
|
119
|
-
value
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
123
|
-
end
|
data/lib/sn_foil/version.rb
DELETED
data/lib/sn_foil.rb
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'sn_foil/version'
|
4
|
-
require_relative 'sn_foil/contexts/build_context'
|
5
|
-
require_relative 'sn_foil/contexts/index_context'
|
6
|
-
require_relative 'sn_foil/contexts/show_context'
|
7
|
-
require_relative 'sn_foil/contexts/create_context'
|
8
|
-
require_relative 'sn_foil/contexts/update_context'
|
9
|
-
require_relative 'sn_foil/contexts/destroy_context'
|
10
|
-
require_relative 'sn_foil/context'
|
11
|
-
require_relative 'sn_foil/policy'
|
12
|
-
require_relative 'sn_foil/searcher'
|
13
|
-
require_relative 'sn_foil/adapters/orms/base_adapter'
|
14
|
-
require_relative 'sn_foil/adapters/orms/active_record'
|
15
|
-
require 'active_support/core_ext/module/attribute_accessors'
|
16
|
-
require 'logger'
|
17
|
-
|
18
|
-
module SnFoil
|
19
|
-
class Error < StandardError; end
|
20
|
-
|
21
|
-
mattr_accessor :orm, default: 'active_record'
|
22
|
-
mattr_writer :logger
|
23
|
-
|
24
|
-
class << self
|
25
|
-
def logger
|
26
|
-
@logger ||= Logger.new($stdout).tap do |log|
|
27
|
-
log.progname = name
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def adapter
|
32
|
-
return @adapter if @adapter
|
33
|
-
|
34
|
-
@adapter ||= if orm.instance_of?(String) || orm.instance_of?(Symbol)
|
35
|
-
if Object.const_defined?("SnFoil::Adapters::ORMs::#{orm.camelcase}")
|
36
|
-
"SnFoil::Adapters::ORMs::#{orm.camelcase}".constantize
|
37
|
-
else
|
38
|
-
orm.constantize
|
39
|
-
end
|
40
|
-
else
|
41
|
-
orm
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def configure
|
46
|
-
yield self
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|