snfoil 0.9.0 → 1.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/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 +15 -1
- 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 +100 -33
- 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
|