rql 0.1.0 → 0.1.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 +24 -6
- data/lib/rql/dsl/base.rb +23 -18
- data/lib/rql/dsl/context.rb +7 -5
- data/lib/rql/queryable.rb +2 -2
- data/lib/rql/scope/block_methods.rb +3 -3
- data/lib/rql/scope/param_methods.rb +1 -1
- data/lib/rql/scope/rql_scope.rb +10 -1
- data/lib/rql/version.rb +1 -1
- data/rql.gemspec +2 -2
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7b4ab947240986e99b39fe5a70b079e1fbd6e047
|
4
|
+
data.tar.gz: 3e3962ff1f6062d0c39494f17adeebc443927697
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd912988d5e371defaf25597e97b8f6b3b1c162be6f43e4c543eff1db2eca2d5af096de63cccd3982b350e91182137368f7306307b6e3550ed6323788e69cb15
|
7
|
+
data.tar.gz: 249aa513b6aa047032c23732900986e009e4b3090834c85b94995f2c10946c217a462f74a4cba043b7f504a925249547b0e8b37f3f93811dc3ea91f4f0801125
|
data/README.md
CHANGED
@@ -1,8 +1,6 @@
|
|
1
|
-
#
|
1
|
+
# RQL
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
3
|
+
RQL is a DSL for active record designed to allow derived/calculated attributes on models to be used in database queries.
|
6
4
|
|
7
5
|
## Installation
|
8
6
|
|
@@ -22,7 +20,27 @@ Or install it yourself as:
|
|
22
20
|
|
23
21
|
## Usage
|
24
22
|
|
25
|
-
|
23
|
+
You can define a derived attribute in your model like this:
|
24
|
+
```ruby
|
25
|
+
class Book < ActiveRecord::Base
|
26
|
+
include Rql::Queryable
|
27
|
+
|
28
|
+
derived_attr :leaves do
|
29
|
+
pages / 2
|
30
|
+
end
|
31
|
+
end
|
32
|
+
```
|
33
|
+
|
34
|
+
and use it in a query like this:
|
35
|
+
```ruby
|
36
|
+
Book.rql.where(leaves: 100)
|
37
|
+
```
|
38
|
+
|
39
|
+
or
|
40
|
+
|
41
|
+
```ruby
|
42
|
+
Book.rql.where{leaves > 100}
|
43
|
+
```
|
26
44
|
|
27
45
|
## Development
|
28
46
|
|
@@ -32,7 +50,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
32
50
|
|
33
51
|
## Contributing
|
34
52
|
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
53
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/liefni/rql.
|
36
54
|
|
37
55
|
## License
|
38
56
|
|
data/lib/rql/dsl/base.rb
CHANGED
@@ -7,39 +7,44 @@ module Rql
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def respond_to_missing?(method_name, include_private = false)
|
10
|
-
derived(method_name) || model?(method_name) || attribute?(method_name) || super
|
10
|
+
derived?(method_name) || model?(method_name) || attribute?(method_name) || super
|
11
11
|
end
|
12
12
|
|
13
13
|
def method_missing(method_name, *params)
|
14
14
|
if respond_to_missing?(method_name)
|
15
15
|
raise ArgumentError.new("wrong number of arguments for `#{method_name}' (given #{params.length}, expected 0)") if (params.length > 0)
|
16
16
|
|
17
|
-
|
17
|
+
derive(method_name) || build_context(method_name)
|
18
18
|
else
|
19
19
|
super
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
protected
|
24
|
+
def build_context(name)
|
25
|
+
Context.new(@model, @model.arel_table[name], name)
|
26
|
+
end
|
26
27
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
def derive(attribute)
|
29
|
+
derived = @model.try(:derived_attributes)&.fetch(attribute, nil)
|
30
|
+
if derived
|
31
|
+
derived = instance_eval(&derived)
|
32
|
+
derived = derived.as(attribute.to_s) if derived && @alias_derived_attr
|
33
|
+
end
|
34
|
+
derived
|
32
35
|
end
|
33
|
-
derived
|
34
|
-
end
|
35
36
|
|
36
|
-
|
37
|
-
|
38
|
-
|
37
|
+
def derived?(attribute)
|
38
|
+
!!@model.try(:derived_attributes)&.fetch(attribute, nil)
|
39
|
+
end
|
39
40
|
|
40
|
-
|
41
|
-
|
42
|
-
|
41
|
+
def model?(attribute)
|
42
|
+
(attribute.to_s.classify.constantize rescue nil)&.ancestors&.include?(ActiveRecord::Base)
|
43
|
+
end
|
44
|
+
|
45
|
+
def attribute?(attribute)
|
46
|
+
@model.column_names.include?(attribute.to_s)
|
47
|
+
end
|
43
48
|
end
|
44
49
|
end
|
45
50
|
end
|
data/lib/rql/dsl/context.rb
CHANGED
@@ -7,11 +7,11 @@ module Rql
|
|
7
7
|
include Orders
|
8
8
|
include Logic
|
9
9
|
|
10
|
-
def initialize(
|
11
|
-
@
|
10
|
+
def initialize(scope, arel, name = nil)
|
11
|
+
@scope = scope
|
12
|
+
@model = scope.unscoped
|
12
13
|
@arel = arel
|
13
14
|
@name = name
|
14
|
-
@scope = scope || model
|
15
15
|
end
|
16
16
|
|
17
17
|
def arel
|
@@ -28,11 +28,13 @@ module Rql
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def rql
|
31
|
-
Context.new(@
|
31
|
+
Context.new(@scope.rql, @arel, @name)
|
32
32
|
end
|
33
33
|
|
34
34
|
def where(*attributes, &block)
|
35
|
-
|
35
|
+
model = @name.to_s.classify.constantize
|
36
|
+
model = model.rql if @scope.is_a?(Scope::RqlScope)
|
37
|
+
Context.new(@scope.merge(model.where(*attributes, &block)), @arel, @name)
|
36
38
|
end
|
37
39
|
end
|
38
40
|
end
|
data/lib/rql/queryable.rb
CHANGED
@@ -9,8 +9,8 @@ module Rql
|
|
9
9
|
return Scope::RqlScope.new(all)
|
10
10
|
end
|
11
11
|
|
12
|
-
def eval_rql(&query)
|
13
|
-
Dsl::Base.new(self).instance_eval(&query)
|
12
|
+
def eval_rql(alias_derived_attr = false, &query)
|
13
|
+
Dsl::Base.new(self, alias_derived_attr).instance_eval(&query)
|
14
14
|
end
|
15
15
|
|
16
16
|
def derive_attr(name, &query)
|
@@ -6,7 +6,7 @@ module Rql
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def select(&block)
|
9
|
-
scope.select(*build_attributes(&block))
|
9
|
+
scope.select(*build_attributes(true, &block))
|
10
10
|
end
|
11
11
|
|
12
12
|
def order(&block)
|
@@ -28,8 +28,8 @@ module Rql
|
|
28
28
|
joins.map(&:to_h)
|
29
29
|
end
|
30
30
|
|
31
|
-
def build_attributes(&block)
|
32
|
-
attributes = scope.eval_rql(&block)
|
31
|
+
def build_attributes(alias_derived_attr = false, &block)
|
32
|
+
attributes = scope.eval_rql(alias_derived_attr, &block)
|
33
33
|
attributes = [attributes] unless attributes.is_a?(Array)
|
34
34
|
attributes.map(&:arel)
|
35
35
|
end
|
@@ -6,7 +6,7 @@ module Rql
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def select(*attributes)
|
9
|
-
scope.select(*attributes.map{|attr| scope.derived_attributes[attr]
|
9
|
+
scope.select(*attributes.map{|attr| scope.derived_attributes[attr] ? scope.eval_rql(true, &scope.derived_attributes[attr]).arel : attr})
|
10
10
|
end
|
11
11
|
|
12
12
|
def order(*attributes)
|
data/lib/rql/scope/rql_scope.rb
CHANGED
@@ -23,10 +23,19 @@ module Rql
|
|
23
23
|
|
24
24
|
def respond_to_missing?(method_name, include_private = false)
|
25
25
|
@block_methods.respond_to?(method_name, include_private) ||
|
26
|
-
@param_methods.
|
26
|
+
@param_methods.respond_to?(method_name, include_private) ||
|
27
27
|
super.respond_to?(method_name, include_private) ||
|
28
28
|
super
|
29
29
|
end
|
30
|
+
|
31
|
+
def merge(other)
|
32
|
+
other = other.scope if other.is_a?(RqlScope)
|
33
|
+
RqlScope.new(scope.merge(other))
|
34
|
+
end
|
35
|
+
|
36
|
+
def to_a
|
37
|
+
scope.to_a
|
38
|
+
end
|
30
39
|
end
|
31
40
|
end
|
32
41
|
end
|
data/lib/rql/version.rb
CHANGED
data/rql.gemspec
CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_development_dependency "bundler", "~> 1.16"
|
25
25
|
spec.add_development_dependency "rake", "~> 10.0"
|
26
26
|
spec.add_development_dependency "rspec", "~> 3.0"
|
27
|
-
spec.add_development_dependency "
|
27
|
+
spec.add_development_dependency "pg"
|
28
28
|
|
29
|
-
spec.add_runtime_dependency "activerecord", "
|
29
|
+
spec.add_runtime_dependency "activerecord", ">= 5.0"
|
30
30
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lief Nikkel
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-06-
|
11
|
+
date: 2018-06-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -53,7 +53,7 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '3.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: pg
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
@@ -70,14 +70,14 @@ dependencies:
|
|
70
70
|
name: activerecord
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '5.0'
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '5.0'
|
83
83
|
description: RQL is a DSL that allows derived attributes in Active Record models to
|