halumi 0.1.1 → 0.2.3
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 +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
|
+
 
|
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
|
- - ">="
|