snfoil 0.5.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SnFoil
4
+ VERSION = '0.5.5'
5
+ 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: []