halumi 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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: []