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.
- checksums.yaml +7 -0
- data/README.md +49 -0
- data/lib/halumi/query.rb +57 -0
- data/lib/halumi.rb +1 -0
- 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
|
+
```
|
data/lib/halumi/query.rb
ADDED
@@ -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: []
|