halumi 0.1.1 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +25 -4
- data/lib/halumi/query.rb +21 -3
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d1b49d5233260f9d57b96dea92baa8eb3e441ed7647d6738227237735a053eeb
|
4
|
+
data.tar.gz: e2ce02794b63f2db20303a6cfdb27043a914de8da515e2b90139fa42959b2f9c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d3b9bed53256c5d7aaeab098bb78a09cf3410bcb9d3b6dc1bb0fe4e863f1a0f046ce60ceaedf44dad15317f473e05ed78f203c61540fa3af55baa21bc751dd22
|
7
|
+
data.tar.gz: 3e0804e11cd4b2693d28414ad7ebb0ff833f2564c8a2d3559cbd82632ad728d0caeffa47953933a0f5e6eeec6c26252dbc3859c933a7757bef59a9ca71d29fc6
|
data/README.md
CHANGED
@@ -1,8 +1,25 @@
|
|
1
1
|
# Halumi
|
2
|
+
![Gem](https://img.shields.io/gem/v/halumi.svg) ![GitHub](https://img.shields.io/github/license/PiotrWald/halumi.svg)
|
3
|
+
|
4
|
+
One of the patterns in Rails development I find usefull are query objects.
|
5
|
+
They are essantialy service objects returning a ActiveRecord Relation. Using them
|
6
|
+
results in less code cluttering your controllers and models. Plus you can easily
|
7
|
+
unit test each of your queries.
|
8
|
+
|
9
|
+
This Gem adds simple DSL allowing you to build query objects and than merge
|
10
|
+
them into one query (ActiveRecord::Relation)
|
11
|
+
|
12
|
+
One of the cool patterns in Rails development are query objects.
|
13
|
+
They are essantialy service objects returning a ActiveRecord Relation. Using them
|
14
|
+
results in less code cluttering your controllers and models. Plus you can easily
|
15
|
+
unit test each of your queries.
|
16
|
+
|
17
|
+
This Gem adds simple DSL allowing you to build query objects and than combining
|
18
|
+
them into one query that will be executed against your database
|
2
19
|
|
3
20
|
## Example usage
|
4
21
|
|
5
|
-
### Define your query
|
22
|
+
### Define your 'super' query combining 3 subqueries
|
6
23
|
|
7
24
|
```Ruby
|
8
25
|
class ArticlesQuery < Halumi::Query
|
@@ -19,20 +36,22 @@ class PaginationQuery < Halumi::Query
|
|
19
36
|
param :per_page
|
20
37
|
param :page
|
21
38
|
|
22
|
-
def
|
39
|
+
def execute
|
23
40
|
relation.page(page).per(per_page)
|
24
41
|
end
|
25
42
|
end
|
26
43
|
```
|
27
44
|
```Ruby
|
28
45
|
class PublishedArticlesQuery
|
29
|
-
|
46
|
+
def execute
|
47
|
+
relation.where(published: true)
|
48
|
+
end
|
30
49
|
end
|
31
50
|
```
|
32
51
|
|
33
52
|
```Ruby
|
34
53
|
class OrderArticlesQuery < Halumi::Query
|
35
|
-
def
|
54
|
+
def execute
|
36
55
|
relation.order(:created_at)
|
37
56
|
end
|
38
57
|
end
|
@@ -41,6 +60,8 @@ end
|
|
41
60
|
|
42
61
|
### Run your query
|
43
62
|
|
63
|
+
This will return published articles, paginated and sorted by creation time
|
64
|
+
|
44
65
|
```Ruby
|
45
66
|
|
46
67
|
params = { page: 2, per_page: 10 }
|
data/lib/halumi/query.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Halumi
|
2
2
|
class Query
|
3
3
|
@subqueries = []
|
4
|
+
@defined_params = []
|
4
5
|
@relation = nil
|
5
6
|
|
6
7
|
attr_reader :relation
|
@@ -8,6 +9,7 @@ module Halumi
|
|
8
9
|
def self.inherited(klass)
|
9
10
|
klass.instance_variable_set(:@subqueries, @subqueries.clone)
|
10
11
|
klass.instance_variable_set(:@relation, @relation)
|
12
|
+
klass.instance_variable_set(:@defined_params, [])
|
11
13
|
end
|
12
14
|
|
13
15
|
def self.model(model)
|
@@ -18,10 +20,12 @@ module Halumi
|
|
18
20
|
@subqueries << subquery
|
19
21
|
end
|
20
22
|
|
21
|
-
def self.param(param_name, &block)
|
22
|
-
block ||= proc { @params[param_name] }
|
23
|
+
def self.param(param_name, type = nil, &block)
|
24
|
+
block ||= proc { type ? type[@params[param_name]] : @params[param_name] }
|
23
25
|
|
24
26
|
define_method(param_name, block)
|
27
|
+
|
28
|
+
@defined_params << param_name
|
25
29
|
end
|
26
30
|
|
27
31
|
def initialize(params = {}, relation = nil)
|
@@ -31,11 +35,21 @@ module Halumi
|
|
31
35
|
end
|
32
36
|
|
33
37
|
def call
|
34
|
-
respond_to?(:execute) ?
|
38
|
+
respond_to?(:execute) ? safe_execute : merge_subqueries
|
35
39
|
end
|
36
40
|
|
37
41
|
private
|
38
42
|
|
43
|
+
def safe_execute
|
44
|
+
validate_params && execute
|
45
|
+
rescue Dry::Types::ConstraintError
|
46
|
+
relation
|
47
|
+
end
|
48
|
+
|
49
|
+
def validate_params
|
50
|
+
class_defined_params.each { |p| public_send(p) }
|
51
|
+
end
|
52
|
+
|
39
53
|
def merge_subqueries
|
40
54
|
@subqueries.map(&:call).reduce(&:merge)
|
41
55
|
end
|
@@ -53,5 +67,9 @@ module Halumi
|
|
53
67
|
def class_relation
|
54
68
|
self.class.instance_variable_get(:@relation)
|
55
69
|
end
|
70
|
+
|
71
|
+
def class_defined_params
|
72
|
+
self.class.instance_variable_get(:@defined_params)
|
73
|
+
end
|
56
74
|
end
|
57
75
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: halumi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Wald
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '5.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: dry-types
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.14.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.14.0
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rspec
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -58,9 +72,9 @@ require_paths:
|
|
58
72
|
- lib
|
59
73
|
required_ruby_version: !ruby/object:Gem::Requirement
|
60
74
|
requirements:
|
61
|
-
- - "
|
75
|
+
- - ">"
|
62
76
|
- !ruby/object:Gem::Version
|
63
|
-
version: '
|
77
|
+
version: '2.2'
|
64
78
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
80
|
- - ">="
|