halumi 0.1.1 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +25 -4
  3. data/lib/halumi/query.rb +21 -3
  4. metadata +17 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8f073aad03ffa24817de5c813b8940adf1b9e3bb4dc84016d4263c3c636f8c03
4
- data.tar.gz: 0741c790a439a10e55ce0dffc66a1c6f99ac0f66c054e93392db6b3c2e5bba37
3
+ metadata.gz: d1b49d5233260f9d57b96dea92baa8eb3e441ed7647d6738227237735a053eeb
4
+ data.tar.gz: e2ce02794b63f2db20303a6cfdb27043a914de8da515e2b90139fa42959b2f9c
5
5
  SHA512:
6
- metadata.gz: 200ecb3c6c8822e5c960ab81db3fff314ec0b53d5463623524dbee0c94f4a5770baf0629ae964dfa2a0ed15b3191adae0ef41c3a203d9e01a2bdf65847e99909
7
- data.tar.gz: 7bc729f135d3b6e7b5a8c5b54263bfdd0c9d13c224b4e5216353b80bd87eae676253677094c34f707baeb8f0580e5f3a6b532149dc4767d360122c34ede054ef
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 classes
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 call
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
- relation.where(published: true)
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 call
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) ? execute : merge_subqueries
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.1.1
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: '0'
77
+ version: '2.2'
64
78
  required_rubygems_version: !ruby/object:Gem::Requirement
65
79
  requirements:
66
80
  - - ">="