snfoil 0.5.5
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 +7 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/README.md +43 -0
- data/Rakefile +4 -0
- data/lib/sn_foil.rb +49 -0
- data/lib/sn_foil/adapters/orms/active_record.rb +36 -0
- data/lib/sn_foil/adapters/orms/base_adapter.rb +29 -0
- data/lib/sn_foil/context.rb +24 -0
- data/lib/sn_foil/contexts/build_context.rb +43 -0
- data/lib/sn_foil/contexts/change_context.rb +100 -0
- data/lib/sn_foil/contexts/create_context.rb +167 -0
- data/lib/sn_foil/contexts/destroy_context.rb +161 -0
- data/lib/sn_foil/contexts/index_context.rb +64 -0
- data/lib/sn_foil/contexts/setup_context.rb +118 -0
- data/lib/sn_foil/contexts/show_context.rb +61 -0
- data/lib/sn_foil/contexts/update_context.rb +164 -0
- data/lib/sn_foil/policy.rb +54 -0
- data/lib/sn_foil/searcher.rb +104 -0
- data/lib/sn_foil/version.rb +5 -0
- metadata +203 -0
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_support/concern'
|
4
|
+
|
5
|
+
module SnFoil
|
6
|
+
module Policy
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
attr_reader :record, :entity
|
10
|
+
attr_accessor :options
|
11
|
+
def initialize(entity, record, options = {})
|
12
|
+
@record = record
|
13
|
+
@entity = entity
|
14
|
+
@options = options
|
15
|
+
end
|
16
|
+
|
17
|
+
def index?
|
18
|
+
false
|
19
|
+
end
|
20
|
+
|
21
|
+
def show?
|
22
|
+
false
|
23
|
+
end
|
24
|
+
|
25
|
+
def create?
|
26
|
+
false
|
27
|
+
end
|
28
|
+
|
29
|
+
def update?
|
30
|
+
false
|
31
|
+
end
|
32
|
+
|
33
|
+
def destroy?
|
34
|
+
false
|
35
|
+
end
|
36
|
+
|
37
|
+
def associate?
|
38
|
+
false
|
39
|
+
end
|
40
|
+
|
41
|
+
class Scope
|
42
|
+
attr_reader :scope, :entity
|
43
|
+
|
44
|
+
def initialize(scope, entity = nil)
|
45
|
+
@entity = entity
|
46
|
+
@scope = scope
|
47
|
+
end
|
48
|
+
|
49
|
+
def resolve
|
50
|
+
scope.all
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,104 @@
|
|
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
|
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
|
+
end
|
31
|
+
|
32
|
+
def model
|
33
|
+
self.class.i_model
|
34
|
+
end
|
35
|
+
|
36
|
+
attr_reader :scope
|
37
|
+
def initialize(scope: nil)
|
38
|
+
@scope = scope || model.all
|
39
|
+
end
|
40
|
+
|
41
|
+
def search(params = {})
|
42
|
+
params = transform_params_booleans(params) # this is required for params coming in from http-like sources
|
43
|
+
filtered_scope = filter || scope # start usimg the default scope of the class or the filter method
|
44
|
+
filtered_scope = apply_setup(filtered_scope, params)
|
45
|
+
apply_filters(filtered_scope, params)
|
46
|
+
end
|
47
|
+
|
48
|
+
def filter; end
|
49
|
+
|
50
|
+
def setup
|
51
|
+
self.class.i_setup
|
52
|
+
end
|
53
|
+
|
54
|
+
def filters
|
55
|
+
self.class.i_filters || []
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def apply_setup(filtered_scope, params)
|
61
|
+
return filtered_scope if setup.nil?
|
62
|
+
|
63
|
+
if setup.is_a?(Symbol) || setup.is_a?(String)
|
64
|
+
send(setup, filtered_scope, params)
|
65
|
+
else
|
66
|
+
instance_exec filtered_scope, params, &setup
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def apply_filters(filtered_scope, params)
|
71
|
+
filters&.reduce(filtered_scope) do |i_scope, i_filter|
|
72
|
+
apply_filter(i_filter, i_scope, params)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def apply_filter(i_filter, filtered_scope, params)
|
77
|
+
return filtered_scope unless filter_valid?(i_filter, params)
|
78
|
+
|
79
|
+
return send(i_filter[:method], filtered_scope, params) if i_filter[:method]
|
80
|
+
|
81
|
+
instance_exec filtered_scope, params, &i_filter[:block]
|
82
|
+
end
|
83
|
+
|
84
|
+
def filter_valid?(i_filter, params)
|
85
|
+
return false if !i_filter[:if].nil? && i_filter[:if].call(params) == false
|
86
|
+
return false if !i_filter[:unless].nil? && i_filter[:unless].call(params) == true
|
87
|
+
|
88
|
+
true
|
89
|
+
end
|
90
|
+
|
91
|
+
def transform_params_booleans(params)
|
92
|
+
params.map do |key, value|
|
93
|
+
value = if value == 'true'
|
94
|
+
true
|
95
|
+
elsif value == 'false'
|
96
|
+
false
|
97
|
+
else
|
98
|
+
value
|
99
|
+
end
|
100
|
+
[key, value]
|
101
|
+
end.to_h
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
metadata
ADDED
@@ -0,0 +1,203 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: snfoil
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.5.5
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Matthew Howes
|
8
|
+
- Danny Murphy
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2020-07-21 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activesupport
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 5.2.4.3
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 5.2.4.3
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: logger
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - "~>"
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '1.0'
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '1.0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: pundit
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - "~>"
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '2.0'
|
49
|
+
type: :runtime
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - "~>"
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '2.0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: bundler
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - "~>"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '2.0'
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '2.0'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: dry-struct
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - "~>"
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '1.0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - "~>"
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '1.0'
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: pry-byebug
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - "~>"
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '3.0'
|
91
|
+
type: :development
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - "~>"
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '3.0'
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: rake
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - "~>"
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '13.0'
|
105
|
+
type: :development
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - "~>"
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '13.0'
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: rspec
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - "~>"
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '3.9'
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - "~>"
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '3.9'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: rubocop
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - "~>"
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: 0.76.0
|
133
|
+
type: :development
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - "~>"
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: 0.76.0
|
140
|
+
- !ruby/object:Gem::Dependency
|
141
|
+
name: rubocop-rspec
|
142
|
+
requirement: !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - "~>"
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: 1.36.0
|
147
|
+
type: :development
|
148
|
+
prerelease: false
|
149
|
+
version_requirements: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - "~>"
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: 1.36.0
|
154
|
+
description:
|
155
|
+
email:
|
156
|
+
- howeszy@gmail.com
|
157
|
+
- dmurph24@gmail.com
|
158
|
+
executables: []
|
159
|
+
extensions: []
|
160
|
+
extra_rdoc_files: []
|
161
|
+
files:
|
162
|
+
- CODE_OF_CONDUCT.md
|
163
|
+
- README.md
|
164
|
+
- Rakefile
|
165
|
+
- lib/sn_foil.rb
|
166
|
+
- lib/sn_foil/adapters/orms/active_record.rb
|
167
|
+
- lib/sn_foil/adapters/orms/base_adapter.rb
|
168
|
+
- lib/sn_foil/context.rb
|
169
|
+
- lib/sn_foil/contexts/build_context.rb
|
170
|
+
- lib/sn_foil/contexts/change_context.rb
|
171
|
+
- lib/sn_foil/contexts/create_context.rb
|
172
|
+
- lib/sn_foil/contexts/destroy_context.rb
|
173
|
+
- lib/sn_foil/contexts/index_context.rb
|
174
|
+
- lib/sn_foil/contexts/setup_context.rb
|
175
|
+
- lib/sn_foil/contexts/show_context.rb
|
176
|
+
- lib/sn_foil/contexts/update_context.rb
|
177
|
+
- lib/sn_foil/policy.rb
|
178
|
+
- lib/sn_foil/searcher.rb
|
179
|
+
- lib/sn_foil/version.rb
|
180
|
+
homepage: https://github.com/howeszy/snfoil
|
181
|
+
licenses:
|
182
|
+
- MIT
|
183
|
+
metadata: {}
|
184
|
+
post_install_message:
|
185
|
+
rdoc_options: []
|
186
|
+
require_paths:
|
187
|
+
- lib
|
188
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
189
|
+
requirements:
|
190
|
+
- - ">="
|
191
|
+
- !ruby/object:Gem::Version
|
192
|
+
version: '0'
|
193
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
194
|
+
requirements:
|
195
|
+
- - ">="
|
196
|
+
- !ruby/object:Gem::Version
|
197
|
+
version: '0'
|
198
|
+
requirements: []
|
199
|
+
rubygems_version: 3.0.3
|
200
|
+
signing_key:
|
201
|
+
specification_version: 4
|
202
|
+
summary: A boilerplate gem for providing basic contexts
|
203
|
+
test_files: []
|