halumi 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.
Files changed (5) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +49 -0
  3. data/lib/halumi/query.rb +57 -0
  4. data/lib/halumi.rb +1 -0
  5. metadata +74 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 8f073aad03ffa24817de5c813b8940adf1b9e3bb4dc84016d4263c3c636f8c03
4
+ data.tar.gz: 0741c790a439a10e55ce0dffc66a1c6f99ac0f66c054e93392db6b3c2e5bba37
5
+ SHA512:
6
+ metadata.gz: 200ecb3c6c8822e5c960ab81db3fff314ec0b53d5463623524dbee0c94f4a5770baf0629ae964dfa2a0ed15b3191adae0ef41c3a203d9e01a2bdf65847e99909
7
+ data.tar.gz: 7bc729f135d3b6e7b5a8c5b54263bfdd0c9d13c224b4e5216353b80bd87eae676253677094c34f707baeb8f0580e5f3a6b532149dc4767d360122c34ede054ef
data/README.md ADDED
@@ -0,0 +1,49 @@
1
+ # Halumi
2
+
3
+ ## Example usage
4
+
5
+ ### Define your query classes
6
+
7
+ ```Ruby
8
+ class ArticlesQuery < Halumi::Query
9
+ model Article
10
+
11
+ merge PaginationQuery
12
+ merge PublishedArticlesQuery
13
+ merge OrderArticlesQuery
14
+ end
15
+ ```
16
+
17
+ ```Ruby
18
+ class PaginationQuery < Halumi::Query
19
+ param :per_page
20
+ param :page
21
+
22
+ def call
23
+ relation.page(page).per(per_page)
24
+ end
25
+ end
26
+ ```
27
+ ```Ruby
28
+ class PublishedArticlesQuery
29
+ relation.where(published: true)
30
+ end
31
+ ```
32
+
33
+ ```Ruby
34
+ class OrderArticlesQuery < Halumi::Query
35
+ def call
36
+ relation.order(:created_at)
37
+ end
38
+ end
39
+
40
+ ```
41
+
42
+ ### Run your query
43
+
44
+ ```Ruby
45
+
46
+ params = { page: 2, per_page: 10 }
47
+
48
+ ArticlesQuery.new(params).call
49
+ ```
@@ -0,0 +1,57 @@
1
+ module Halumi
2
+ class Query
3
+ @subqueries = []
4
+ @relation = nil
5
+
6
+ attr_reader :relation
7
+
8
+ def self.inherited(klass)
9
+ klass.instance_variable_set(:@subqueries, @subqueries.clone)
10
+ klass.instance_variable_set(:@relation, @relation)
11
+ end
12
+
13
+ def self.model(model)
14
+ @relation = model.all
15
+ end
16
+
17
+ def self.merge(subquery)
18
+ @subqueries << subquery
19
+ end
20
+
21
+ def self.param(param_name, &block)
22
+ block ||= proc { @params[param_name] }
23
+
24
+ define_method(param_name, block)
25
+ end
26
+
27
+ def initialize(params = {}, relation = nil)
28
+ @relation = relation&.all || class_relation
29
+ @params = params
30
+ @subqueries = subqueries
31
+ end
32
+
33
+ def call
34
+ respond_to?(:execute) ? execute : merge_subqueries
35
+ end
36
+
37
+ private
38
+
39
+ def merge_subqueries
40
+ @subqueries.map(&:call).reduce(&:merge)
41
+ end
42
+
43
+ def subqueries
44
+ class_subqueries.map do |query|
45
+ query.new(@params, @relation)
46
+ end
47
+ end
48
+
49
+ def class_subqueries
50
+ self.class.instance_variable_get(:@subqueries)
51
+ end
52
+
53
+ def class_relation
54
+ self.class.instance_variable_get(:@relation)
55
+ end
56
+ end
57
+ end
data/lib/halumi.rb ADDED
@@ -0,0 +1 @@
1
+ require 'halumi/query'
metadata ADDED
@@ -0,0 +1,74 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: halumi
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Piotr Wald
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-03-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '5.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '5.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 3.6.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 3.6.0
41
+ description:
42
+ email:
43
+ - valdpiotr@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - README.md
49
+ - lib/halumi.rb
50
+ - lib/halumi/query.rb
51
+ homepage: https://github.com/PiotrWald/halumi
52
+ licenses:
53
+ - MIT
54
+ metadata: {}
55
+ post_install_message:
56
+ rdoc_options: []
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ requirements: []
70
+ rubygems_version: 3.0.1
71
+ signing_key:
72
+ specification_version: 4
73
+ summary: Use query objects as flexible building blocks
74
+ test_files: []