gyroscope 0.1.1 → 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/lib/gyroscope/search_base.rb +43 -31
- data/lib/gyroscope/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fa8748d31c73c8bff773acbfc2e9dbbbae9b9ce1
|
4
|
+
data.tar.gz: ce805aa11148b58ffc62e0f555ca801df0c793dd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 018dcabf4fc922a448ebfed4d045405df0790118a432985b9997984b93f25b2d37bca1a58b64e3e30f9a511a1d2d5c7d61a6fe659b67d4dcd2d9a38419ec1b2d
|
7
|
+
data.tar.gz: 7e8a9b60dadc2b352b5d3372bc9710368777942f830fcc985f562cdc56596715aa161ee1412cb6110bbb4a284b4f808ec4aa6c65b4c28ead60f3f1726eb2aa9f
|
@@ -3,24 +3,6 @@ require "active_model"
|
|
3
3
|
|
4
4
|
module Gyroscope
|
5
5
|
class SearchBase
|
6
|
-
include Virtus.model strict: true, required: false
|
7
|
-
include ActiveModel::Validations
|
8
|
-
|
9
|
-
attribute :page, Integer, default: 1
|
10
|
-
attribute :per_page, Integer, default: 30
|
11
|
-
attribute :order, String
|
12
|
-
|
13
|
-
validate :validate_order
|
14
|
-
|
15
|
-
def initialize(*args)
|
16
|
-
super(*args)
|
17
|
-
normalize_order attributes[:order]
|
18
|
-
end
|
19
|
-
|
20
|
-
def target_model
|
21
|
-
"::#{self.class.name.demodulize}".constantize
|
22
|
-
end
|
23
|
-
|
24
6
|
class ValidationError < StandardError
|
25
7
|
attr_reader :searcher
|
26
8
|
|
@@ -37,27 +19,57 @@ module Gyroscope
|
|
37
19
|
end
|
38
20
|
end
|
39
21
|
|
22
|
+
include Virtus.model strict: true, required: false
|
23
|
+
include ActiveModel::Validations
|
24
|
+
|
25
|
+
attribute :page, Integer, default: 1
|
26
|
+
attribute :per_page, Integer, default: 30
|
27
|
+
attribute :order, String
|
28
|
+
|
29
|
+
validate :validate_order
|
30
|
+
|
31
|
+
def initialize(attrs)
|
32
|
+
super(normalize_order(attrs.dup))
|
33
|
+
end
|
34
|
+
|
35
|
+
def target_model
|
36
|
+
"::#{self.class.name.demodulize}".constantize
|
37
|
+
end
|
38
|
+
|
40
39
|
def search
|
41
40
|
# is there a more generic ActiveModel validation error?
|
42
41
|
unless valid?
|
43
42
|
Rails.logger.debug("the errors: #{errors.inspect}")
|
43
|
+
|
44
|
+
fail ValidationError.new(self)
|
44
45
|
end
|
45
|
-
fail ValidationError.new(self) unless valid?
|
46
46
|
|
47
47
|
build_search_scope
|
48
48
|
end
|
49
49
|
|
50
|
-
|
51
|
-
return unless attributes[:order]
|
50
|
+
private
|
52
51
|
|
53
|
-
|
54
|
-
|
52
|
+
def normalize_order(attrs)
|
53
|
+
order = attrs[:order] || attrs["order"]
|
54
|
+
|
55
|
+
return attrs unless order.present?
|
56
|
+
|
57
|
+
if order.is_a?(Hash)
|
58
|
+
attrs[:order] = order.map {|(column, direction)| tablize_order("#{column} #{direction}")}.join(",")
|
55
59
|
else
|
56
|
-
|
60
|
+
attrs[:order] = tablize_order(order)
|
57
61
|
end
|
62
|
+
|
63
|
+
attrs
|
58
64
|
end
|
59
65
|
|
60
|
-
|
66
|
+
def tablize_order(ordering)
|
67
|
+
unless /\./.match ordering
|
68
|
+
"#{target_model.table_name}.#{ordering}"
|
69
|
+
else
|
70
|
+
ordering
|
71
|
+
end
|
72
|
+
end
|
61
73
|
|
62
74
|
def base_scope
|
63
75
|
scope = target_model
|
@@ -86,16 +98,16 @@ module Gyroscope
|
|
86
98
|
|
87
99
|
def validate_order
|
88
100
|
return unless attributes[:order]
|
89
|
-
|
101
|
+
attributes[:order].split(",").each do |order|
|
102
|
+
key, direction = order.split(' ')
|
90
103
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
errors.add(:order, 'Invalid sort direction') unless direction && %w(asc desc).include?(direction.downcase)
|
104
|
+
errors.add(:order, 'Ordering on disallowed key') unless allowed_order_keys.include? key
|
105
|
+
errors.add(:order, 'Invalid sort direction') unless direction && %w(asc desc).include?(direction.downcase)
|
106
|
+
end
|
95
107
|
end
|
96
108
|
|
97
109
|
def allowed_order_keys
|
98
|
-
target_model.new.
|
110
|
+
target_model.new.persistable_attribute_names.map do |key|
|
99
111
|
"#{target_model.table_name}.#{key}"
|
100
112
|
end
|
101
113
|
end
|
data/lib/gyroscope/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gyroscope
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Wilhelm
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2017-04-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activemodel
|
@@ -152,7 +152,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
152
152
|
version: '0'
|
153
153
|
requirements: []
|
154
154
|
rubyforge_project:
|
155
|
-
rubygems_version: 2.5.1
|
155
|
+
rubygems_version: 2.4.5.1
|
156
156
|
signing_key:
|
157
157
|
specification_version: 4
|
158
158
|
summary: Build ActiveRecord search scopes from params hash
|