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.
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
  - - ">="