parascope 1.2.0 → 1.3.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/README.md +31 -3
- data/bin/console +3 -1
- data/lib/parascope.rb +2 -0
- data/lib/parascope/query.rb +21 -6
- data/lib/parascope/query/api_methods.rb +2 -2
- data/lib/parascope/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3066d6e82e5f23716dd07cea4c449017e70bbd9d
|
4
|
+
data.tar.gz: 56028229436dde9aeb953c6d2a8c3422481a92a4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3067309bd1f430f5aa295a76302b4cd16e23cfdc2a35ec0fccaa14f1a71df6d07663e6adbc38a90222de450c5d35df67b54f48391deb9e90580f2a0728029b93
|
7
|
+
data.tar.gz: 6ac678b8533decc7fabc77179d534f06e1e1c63060025572875bdfb23ca268ca90d1f36060f74f2061999044328d38f470eba184cedbae2c26a0cfc3d67682ff
|
data/README.md
CHANGED
@@ -163,9 +163,10 @@ sifter :paginated do
|
|
163
163
|
end
|
164
164
|
```
|
165
165
|
|
166
|
-
- `guard(&block)` defines a guard instance method block (see instance methods
|
166
|
+
- `guard(message = nil, &block)` defines a guard instance method block (see instance methods
|
167
167
|
bellow). All such blocks are executed before query object resolves scope via
|
168
|
-
`resolve_scope` method.
|
168
|
+
`resolve_scope` method. Optional `message` may be supplied to provide more informative
|
169
|
+
error message.
|
169
170
|
|
170
171
|
*Examples:*
|
171
172
|
|
@@ -173,12 +174,39 @@ end
|
|
173
174
|
sift_by(:sort_col, :sort_dir) do |scol, sdir|
|
174
175
|
# will raise Parascope::GuardViolationError on scope resolution if
|
175
176
|
# params[:sort_dir] is not 'asc' or 'desc'
|
176
|
-
guard
|
177
|
+
guard(':sort_dir should be "asc" or "desc"') do
|
178
|
+
sdir.downcase.in?(%w(asc desc))
|
179
|
+
end
|
177
180
|
|
178
181
|
base_scope { |scope| scope.order(scol => sdir) }
|
179
182
|
end
|
180
183
|
```
|
181
184
|
|
185
|
+
- `raise_on_guard_violation(value)` allows to specify whether or not exception should be raised
|
186
|
+
whenever any guard block is violated during scope resolution. When set to `false`, in case
|
187
|
+
of any violation, `resolved_scope` will return `nil`, and query will have `violation` property
|
188
|
+
set with value corresponding to the message of violated block. Default option value is `true`.
|
189
|
+
|
190
|
+
*Examples:*
|
191
|
+
|
192
|
+
```ruby
|
193
|
+
raise_on_guard_violation false
|
194
|
+
|
195
|
+
sift_by(:sort_col, :sort_dir) do |scol, sdir|
|
196
|
+
guard(':sort_dir should be "asc" or "desc"') do
|
197
|
+
sdir.downcase.in?(%w(asc desc))
|
198
|
+
end
|
199
|
+
|
200
|
+
base_scope { |scope| scope.order(scol => sdir) }
|
201
|
+
end
|
202
|
+
```
|
203
|
+
|
204
|
+
```ruby
|
205
|
+
query = UsersQuery.new(sort_col: 'id', sort_dir: 'there')
|
206
|
+
query.resolved_scope # => nil
|
207
|
+
query.violation # => ":sort_dir should be \"asc\" or \"desc\""
|
208
|
+
```
|
209
|
+
|
182
210
|
- `build(scope: nil, **attributes)` initializes a query with empty params. Handy when
|
183
211
|
query depends only passed attributes and internal logic. Also useful in specs.
|
184
212
|
|
data/bin/console
CHANGED
@@ -6,12 +6,14 @@ require "parascope"
|
|
6
6
|
require 'ostruct'
|
7
7
|
|
8
8
|
class Query < Parascope::Query
|
9
|
+
raise_on_guard_violation false
|
10
|
+
|
9
11
|
defaults barbak: 'barbak'
|
10
12
|
|
11
13
|
base_scope { OpenStruct.new }
|
12
14
|
|
13
15
|
query_by :foo do |foo|
|
14
|
-
guard { foo == 'foo' }
|
16
|
+
guard('wrong value for :foo param. try "foo"') { foo == 'foo' }
|
15
17
|
|
16
18
|
scope.tap{ scope.foo = foo }
|
17
19
|
end
|
data/lib/parascope.rb
CHANGED
data/lib/parascope/query.rb
CHANGED
@@ -7,9 +7,10 @@ module Parascope
|
|
7
7
|
|
8
8
|
extend ApiMethods
|
9
9
|
|
10
|
-
attr_reader :params
|
10
|
+
attr_reader :params, :violation
|
11
11
|
|
12
12
|
def self.inherited(subclass)
|
13
|
+
subclass.raise_on_guard_violation raise_on_guard_violation?
|
13
14
|
subclass.query_blocks.replace query_blocks.dup
|
14
15
|
subclass.sift_blocks.replace sift_blocks.dup
|
15
16
|
subclass.guard_blocks.replace guard_blocks.dup
|
@@ -21,6 +22,14 @@ module Parascope
|
|
21
22
|
new({}, **attrs)
|
22
23
|
end
|
23
24
|
|
25
|
+
def self.raise_on_guard_violation(value)
|
26
|
+
@raise_on_guard_violation = !!value
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.raise_on_guard_violation?
|
30
|
+
@raise_on_guard_violation
|
31
|
+
end
|
32
|
+
|
24
33
|
def initialize(params, scope: nil, dataset: nil, **attrs)
|
25
34
|
@params = Hashie::Mash.new(klass.defaults).merge(params || {})
|
26
35
|
@scope = scope || dataset unless scope.nil? && dataset.nil?
|
@@ -51,10 +60,14 @@ module Parascope
|
|
51
60
|
alias_method :base_dataset, :base_scope
|
52
61
|
|
53
62
|
def resolved_scope(*args)
|
63
|
+
@violation = nil
|
54
64
|
arg_params = args.pop if args.last.is_a?(Hash)
|
55
65
|
return sifted_instance.resolved_scope! if arg_params.nil? && args.empty?
|
56
66
|
|
57
67
|
clone_with_params(trues(args).merge(arg_params || {})).resolved_scope
|
68
|
+
rescue GuardViolationError => error
|
69
|
+
@violation = error.message
|
70
|
+
raise if self.class.raise_on_guard_violation?
|
58
71
|
end
|
59
72
|
alias_method :resolved_dataset, :resolved_scope
|
60
73
|
alias_method :resolve, :resolved_scope
|
@@ -138,13 +151,15 @@ module Parascope
|
|
138
151
|
private
|
139
152
|
|
140
153
|
def guard_all
|
141
|
-
klass.guard_blocks.each{ |block| guard(&block) }
|
154
|
+
klass.guard_blocks.each{ |message, block| guard(message, &block) }
|
142
155
|
end
|
143
156
|
|
144
|
-
def guard(&block)
|
145
|
-
|
146
|
-
|
147
|
-
|
157
|
+
def guard(message = nil, &block)
|
158
|
+
return if instance_exec(&block)
|
159
|
+
|
160
|
+
violation = message || "guard block violated on #{block.source_location.join(':')}"
|
161
|
+
|
162
|
+
fail GuardViolationError, violation
|
148
163
|
end
|
149
164
|
|
150
165
|
def sifted_instance_for(blocks)
|
data/lib/parascope/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: parascope
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Artem Kuzko
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-02-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hashie
|