wallaby-active_record 0.1.1 → 0.2.1
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 +19 -13
- data/lib/adapters/wallaby/active_record/model_decorator.rb +1 -1
- data/lib/adapters/wallaby/active_record/model_decorator/fields_builder/sti_builder.rb +1 -1
- data/lib/adapters/wallaby/active_record/model_pagination_provider.rb +23 -13
- data/lib/adapters/wallaby/active_record/model_service_provider.rb +5 -4
- data/lib/adapters/wallaby/active_record/model_service_provider/querier.rb +1 -1
- data/lib/adapters/wallaby/active_record/model_service_provider/querier/escaper.rb +39 -0
- data/lib/adapters/wallaby/active_record/model_service_provider/querier/transformer.rb +13 -10
- data/lib/wallaby/active_record.rb +1 -1
- data/lib/wallaby/active_record/version.rb +1 -1
- metadata +11 -10
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7d10a3ddeced877f4c004c1d2a5141b6463865a22d673ae91a9ca87a22a3523c
|
|
4
|
+
data.tar.gz: c194bdfef64070a23a5bc0ebdf7d0bdbc327047eb330a459e81b616fd5ab6f84
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: '0695f8352480c7597eae7e5049e8d009ae3f30afa4400c233bd4f036a42abab71780cfe7b62f5c362f21b0a31384dee564655de5fbd76628fd282714eb6f2b8d'
|
|
7
|
+
data.tar.gz: 3c34d83727141ee696e9f839f78ac209fabec0edd1437265f013f23f0ff6531dcba8aa762038cc4487c11a3b599ead2520f0f0b3e46e80b3e0184febf9cd267a
|
data/README.md
CHANGED
|
@@ -1,31 +1,37 @@
|
|
|
1
|
-
# Wallaby::ActiveRecord
|
|
1
|
+
# [Wallaby::ActiveRecord](https://github.com/wallaby-rails/wallaby-active_record)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://badge.fury.io/rb/wallaby-active_record)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
[](https://travis-ci.com/wallaby-rails/wallaby-active_record)
|
|
6
|
+
[](https://codeclimate.com/github/wallaby-rails/wallaby-active_record/maintainability)
|
|
7
|
+
[](https://codeclimate.com/github/wallaby-rails/wallaby-active_record/test_coverage)
|
|
8
|
+
[](https://inch-ci.org/github/wallaby-rails/wallaby-active_record)
|
|
4
9
|
|
|
5
|
-
|
|
10
|
+
Wallaby::ActiveRecord is the ActiveRecord adapter for [Wallaby::Core](https://github.com/wallaby-rails/wallaby-core).
|
|
6
11
|
|
|
7
|
-
|
|
12
|
+
## Install
|
|
13
|
+
|
|
14
|
+
Add `Wallaby::ActiveRecord` to `Gemfile`.
|
|
8
15
|
|
|
9
16
|
```ruby
|
|
10
17
|
gem 'wallaby-active_record'
|
|
11
18
|
```
|
|
12
19
|
|
|
13
|
-
And
|
|
20
|
+
And re-bundle.
|
|
14
21
|
|
|
15
22
|
```shell
|
|
16
|
-
|
|
23
|
+
bundle install
|
|
17
24
|
```
|
|
18
25
|
|
|
19
|
-
|
|
26
|
+
## Documentation
|
|
20
27
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
```
|
|
28
|
+
- [API Reference](https://www.rubydoc.info/gems/wallaby-active_record)
|
|
29
|
+
- [Change Logs](https://github.com/wallaby-rails/wallaby-active_record/blob/master/CHANGELOG.md)
|
|
24
30
|
|
|
25
|
-
##
|
|
31
|
+
## Want to contribute?
|
|
26
32
|
|
|
27
|
-
|
|
33
|
+
Raise an [issue](https://github.com/wallaby-rails/wallaby-active_record/issues/new), discuss and resolve!
|
|
28
34
|
|
|
29
35
|
## License
|
|
30
36
|
|
|
31
|
-
This project
|
|
37
|
+
This project uses [MIT License](https://github.com/wallaby-rails/wallaby-active_record/blob/master/LICENSE).
|
|
@@ -41,7 +41,7 @@ module Wallaby
|
|
|
41
41
|
# @param klass [Class]
|
|
42
42
|
# @return [Boolean] whether the class is ActiveRecord base class
|
|
43
43
|
def top_parent?(klass)
|
|
44
|
-
klass == ModelFinder.base ||
|
|
44
|
+
klass == ModelFinder.base || klass.try(:abstract_class?)
|
|
45
45
|
end
|
|
46
46
|
end
|
|
47
47
|
end
|
|
@@ -2,30 +2,40 @@
|
|
|
2
2
|
|
|
3
3
|
module Wallaby
|
|
4
4
|
class ActiveRecord
|
|
5
|
-
# Model pagination provider
|
|
5
|
+
# Model pagination provider for {Wallaby::ActiveRecord}
|
|
6
6
|
class ModelPaginationProvider < ::Wallaby::ModelPaginationProvider
|
|
7
|
-
# Check if collection
|
|
8
|
-
# @return [
|
|
7
|
+
# Check if collection can be paginated
|
|
8
|
+
# @return [true] if paginatable
|
|
9
|
+
# @return [false] if not paginatable
|
|
9
10
|
def paginatable?
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
paginatable =
|
|
12
|
+
# kaminari
|
|
13
|
+
@collection.respond_to?(:total_count) || \
|
|
14
|
+
@collection.respond_to?(:total_entries) # will_paginate
|
|
15
|
+
unless paginatable
|
|
16
|
+
Rails.logger.warn I18n.t(
|
|
17
|
+
'errors.activerecord.paginatable', collection: @collection.inspect
|
|
18
|
+
)
|
|
15
19
|
end
|
|
20
|
+
|
|
21
|
+
paginatable
|
|
16
22
|
end
|
|
17
23
|
|
|
18
|
-
# @return [Integer] total count for the
|
|
24
|
+
# @return [Integer] total count for the collection
|
|
19
25
|
def total
|
|
20
|
-
|
|
26
|
+
# kaminari
|
|
27
|
+
@collection.try(:total_count) || \
|
|
28
|
+
@collection.try(:total_entries) # will_paginate
|
|
21
29
|
end
|
|
22
30
|
|
|
23
|
-
# @return [Integer] page size from parameters or
|
|
31
|
+
# @return [Integer] page size from parameters or
|
|
32
|
+
# {https://rubydoc.info/gems/wallaby-core/Wallaby/Configuration/Pagination#page_size-instance_method page_size}
|
|
33
|
+
# Wallaby configuration
|
|
24
34
|
def page_size
|
|
25
|
-
@params[:per]
|
|
35
|
+
(@params[:per] || Wallaby.configuration.pagination.page_size).to_i
|
|
26
36
|
end
|
|
27
37
|
|
|
28
|
-
# @return [Integer] page number from parameters
|
|
38
|
+
# @return [Integer] page number from parameters starting from 1
|
|
29
39
|
def page_number
|
|
30
40
|
[@params[:page].to_i, 1].max
|
|
31
41
|
end
|
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
module Wallaby
|
|
4
4
|
class ActiveRecord
|
|
5
|
-
# Model service provider
|
|
6
|
-
# @see Wallaby::ModelServiceProvider
|
|
5
|
+
# Model service provider for {Wallaby::ActiveRecord}
|
|
7
6
|
class ModelServiceProvider < ::Wallaby::ModelServiceProvider
|
|
8
7
|
# @param params [ActionController::Parameters]
|
|
9
8
|
# @param action [String, Symbol]
|
|
@@ -31,9 +30,11 @@ module Wallaby
|
|
|
31
30
|
# @return [ActiveRecord::Relation] paginated query
|
|
32
31
|
# @see Wallaby::ModelServiceProvider#paginate
|
|
33
32
|
def paginate(query, params)
|
|
34
|
-
|
|
33
|
+
# NOTE: do not take out the `.to_i` as will_paginate requires an integer `per_page`
|
|
34
|
+
per = (params[:per] || Wallaby.configuration.pagination.page_size).to_i
|
|
35
35
|
query = query.page params[:page] if query.respond_to? :page
|
|
36
|
-
query = query.per per if query.respond_to? :per
|
|
36
|
+
query = query.per per if query.respond_to? :per # kaminari
|
|
37
|
+
query = query.per_page per if query.respond_to? :per_page # will_paginate
|
|
37
38
|
query
|
|
38
39
|
end
|
|
39
40
|
|
|
@@ -106,7 +106,7 @@ module Wallaby
|
|
|
106
106
|
text_fields.each do |field_name|
|
|
107
107
|
sub_query = nil
|
|
108
108
|
keywords.each do |keyword|
|
|
109
|
-
exp = table[field_name].matches(
|
|
109
|
+
exp = table[field_name].matches(Escaper.execute(keyword))
|
|
110
110
|
sub_query = sub_query.try(:and, exp) || exp
|
|
111
111
|
end
|
|
112
112
|
query = query.try(:or, sub_query) || sub_query
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Wallaby
|
|
4
|
+
class ActiveRecord
|
|
5
|
+
class ModelServiceProvider
|
|
6
|
+
class Querier
|
|
7
|
+
# Build up query using the results
|
|
8
|
+
class Escaper
|
|
9
|
+
include ::ActiveRecord::Sanitization
|
|
10
|
+
LIKE_SIGN = /[%_]/.freeze # :nodoc:
|
|
11
|
+
PCT = '%' # :nodoc:
|
|
12
|
+
|
|
13
|
+
class << self
|
|
14
|
+
def execute(keyword)
|
|
15
|
+
first = keyword.first
|
|
16
|
+
last = keyword.last
|
|
17
|
+
start_with, start_index = LIKE_SIGN.match?(first) ? [true, 1] : [false, 0]
|
|
18
|
+
end_with, end_index = LIKE_SIGN.match?(last) ? [true, -2] : [false, -1]
|
|
19
|
+
escaped = sanitize_sql_like keyword[start_index..end_index]
|
|
20
|
+
starting = sign(start_with, first, end_with)
|
|
21
|
+
ending = sign(end_with, last, start_with)
|
|
22
|
+
|
|
23
|
+
"#{starting}#{escaped}#{ending}"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def sign(
|
|
27
|
+
first_condition, first_char, second_condition, default_sign = PCT
|
|
28
|
+
)
|
|
29
|
+
return first_char if first_condition
|
|
30
|
+
return if second_condition
|
|
31
|
+
|
|
32
|
+
default_sign
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -6,7 +6,7 @@ module Wallaby
|
|
|
6
6
|
class Querier
|
|
7
7
|
# Build up query using the results
|
|
8
8
|
class Transformer < Parslet::Transform
|
|
9
|
-
SIMPLE_OPERATORS = {
|
|
9
|
+
SIMPLE_OPERATORS = { # :nodoc:
|
|
10
10
|
':' => :eq,
|
|
11
11
|
':=' => :eq,
|
|
12
12
|
':!' => :not_eq,
|
|
@@ -24,7 +24,7 @@ module Wallaby
|
|
|
24
24
|
':<=' => :lteq
|
|
25
25
|
}.freeze
|
|
26
26
|
|
|
27
|
-
SEQUENCE_OPERATORS = {
|
|
27
|
+
SEQUENCE_OPERATORS = { # :nodoc:
|
|
28
28
|
':' => :in,
|
|
29
29
|
':=' => :in,
|
|
30
30
|
':!' => :not_in,
|
|
@@ -34,15 +34,18 @@ module Wallaby
|
|
|
34
34
|
':!()' => :not_between
|
|
35
35
|
}.freeze
|
|
36
36
|
|
|
37
|
-
# For single
|
|
38
|
-
rule
|
|
39
|
-
|
|
40
|
-
end
|
|
37
|
+
# For single null
|
|
38
|
+
rule null: simple(:value)
|
|
39
|
+
rule null: sequence(:value)
|
|
41
40
|
|
|
42
|
-
# For
|
|
43
|
-
rule
|
|
44
|
-
|
|
45
|
-
|
|
41
|
+
# For single boolean
|
|
42
|
+
rule(boolean: simple(:value)) { /true/i.match? value }
|
|
43
|
+
|
|
44
|
+
# For single string
|
|
45
|
+
rule(string: simple(:value)) { value.try :to_str }
|
|
46
|
+
|
|
47
|
+
# For multiple strings
|
|
48
|
+
rule(string: sequence(:value)) { EMPTY_STRING }
|
|
46
49
|
|
|
47
50
|
# For operators
|
|
48
51
|
rule left: simple(:left), op: simple(:op), right: simple(:right) do
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require 'kaminari'
|
|
4
3
|
require 'wallaby/core'
|
|
5
4
|
|
|
6
5
|
require 'wallaby/active_record/version'
|
|
@@ -27,6 +26,7 @@ require 'adapters/wallaby/active_record/model_service_provider'
|
|
|
27
26
|
require 'adapters/wallaby/active_record/model_service_provider/normalizer'
|
|
28
27
|
require 'adapters/wallaby/active_record/model_service_provider/permitter'
|
|
29
28
|
require 'adapters/wallaby/active_record/model_service_provider/querier'
|
|
29
|
+
require 'adapters/wallaby/active_record/model_service_provider/querier/escaper'
|
|
30
30
|
require 'adapters/wallaby/active_record/model_service_provider/querier/transformer'
|
|
31
31
|
require 'adapters/wallaby/active_record/model_service_provider/validator'
|
|
32
32
|
# ModelServiceProvider: end
|
metadata
CHANGED
|
@@ -1,43 +1,43 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: wallaby-active_record
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Tian Chen
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2020-02-17 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
|
-
name:
|
|
14
|
+
name: activerecord
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
17
|
- - ">="
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version:
|
|
19
|
+
version: 4.2.0
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - ">="
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version:
|
|
26
|
+
version: 4.2.0
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: wallaby-core
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
|
-
- - "
|
|
31
|
+
- - "~>"
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version:
|
|
33
|
+
version: 0.2.0
|
|
34
34
|
type: :runtime
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
|
-
- - "
|
|
38
|
+
- - "~>"
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version:
|
|
40
|
+
version: 0.2.0
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: cancancan
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -118,6 +118,7 @@ files:
|
|
|
118
118
|
- lib/adapters/wallaby/active_record/model_service_provider/normalizer.rb
|
|
119
119
|
- lib/adapters/wallaby/active_record/model_service_provider/permitter.rb
|
|
120
120
|
- lib/adapters/wallaby/active_record/model_service_provider/querier.rb
|
|
121
|
+
- lib/adapters/wallaby/active_record/model_service_provider/querier/escaper.rb
|
|
121
122
|
- lib/adapters/wallaby/active_record/model_service_provider/querier/transformer.rb
|
|
122
123
|
- lib/adapters/wallaby/active_record/model_service_provider/validator.rb
|
|
123
124
|
- lib/adapters/wallaby/active_record/pundit_provider.rb
|
|
@@ -145,7 +146,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
145
146
|
- !ruby/object:Gem::Version
|
|
146
147
|
version: '0'
|
|
147
148
|
requirements: []
|
|
148
|
-
rubygems_version: 3.0.
|
|
149
|
+
rubygems_version: 3.0.3
|
|
149
150
|
signing_key:
|
|
150
151
|
specification_version: 4
|
|
151
152
|
summary: Wallaby's ActiveRecord ORM adapter
|