devlin 0.0.2 → 0.0.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.
- data/.gitignore +1 -0
- data/lib/devlin/column.rb +6 -1
- data/lib/devlin/query.rb +31 -2
- data/lib/devlin/scope.rb +5 -5
- data/lib/devlin/version.rb +1 -1
- data/spec/query_spec.rb +33 -4
- data/spec/setup_spec.rb +6 -0
- data/spec/spec_helper.rb +1 -1
- metadata +1 -3
- data/spec/test.sqlite3 +0 -0
data/.gitignore
CHANGED
data/lib/devlin/column.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
module Devlin
|
2
2
|
class Column
|
3
|
-
def initialize(name, config)
|
3
|
+
def initialize(name, config, *args)
|
4
4
|
@name = name
|
5
5
|
@config = config
|
6
|
+
@arguments = args.extract_options!
|
6
7
|
end
|
7
8
|
|
8
9
|
def select_definition
|
@@ -20,5 +21,9 @@ module Devlin
|
|
20
21
|
value
|
21
22
|
end
|
22
23
|
end
|
24
|
+
|
25
|
+
def arguments
|
26
|
+
@arguments
|
27
|
+
end
|
23
28
|
end
|
24
29
|
end
|
data/lib/devlin/query.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Devlin
|
2
2
|
class Query
|
3
|
-
attr_reader :query, :scope
|
3
|
+
attr_reader :query, :scope
|
4
4
|
|
5
5
|
def initialize(parent, q)
|
6
6
|
@parent = parent
|
@@ -9,6 +9,7 @@ module Devlin
|
|
9
9
|
@select = query['select']
|
10
10
|
@conditions = query['conditions']
|
11
11
|
@group = query['group']
|
12
|
+
@order = query['order']
|
12
13
|
end
|
13
14
|
|
14
15
|
# This method returns the resulting relation to calculate the given
|
@@ -16,7 +17,7 @@ module Devlin
|
|
16
17
|
def result
|
17
18
|
res = @scope.relation
|
18
19
|
res = res.select(self.select.map { |c| @scope.column(c).select_definition })
|
19
|
-
|
20
|
+
self.conditions.each do |col, val|
|
20
21
|
col, op = col.split('.')
|
21
22
|
res = case op
|
22
23
|
when 'g'
|
@@ -34,6 +35,34 @@ module Devlin
|
|
34
35
|
end
|
35
36
|
end
|
36
37
|
res = res.group(self.group.map { |c| @scope.column(c).definition })
|
38
|
+
self.order.each do |col, val|
|
39
|
+
res = res.order("#{@scope.column(col).definition} #{val}")
|
40
|
+
end
|
41
|
+
res
|
42
|
+
end # def result
|
43
|
+
|
44
|
+
def select
|
45
|
+
@select or raise "No selection columns given"
|
46
|
+
end # def select
|
47
|
+
|
48
|
+
def conditions
|
49
|
+
@conditions || {}
|
50
|
+
end # def conditions
|
51
|
+
|
52
|
+
def group
|
53
|
+
@group || []
|
54
|
+
end # def group
|
55
|
+
|
56
|
+
def order
|
57
|
+
res = {}
|
58
|
+
(@order || {}).each do |key, value|
|
59
|
+
res[key] = case value.to_s.downcase
|
60
|
+
when 'desc'
|
61
|
+
'DESC'
|
62
|
+
else
|
63
|
+
'ASC'
|
64
|
+
end
|
65
|
+
end
|
37
66
|
res
|
38
67
|
end
|
39
68
|
end
|
data/lib/devlin/scope.rb
CHANGED
@@ -14,8 +14,8 @@ module Devlin
|
|
14
14
|
@scope.relation = rel
|
15
15
|
end
|
16
16
|
|
17
|
-
def column(name, definition, &block)
|
18
|
-
@scope.add_column(name, definition, &block)
|
17
|
+
def column(name, definition, *args, &block)
|
18
|
+
@scope.add_column(name, definition, *args, &block)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
@@ -26,12 +26,12 @@ module Devlin
|
|
26
26
|
end
|
27
27
|
|
28
28
|
# add a column definition to the scope
|
29
|
-
def add_column(name, definition, &block)
|
29
|
+
def add_column(name, definition, *args, &block)
|
30
30
|
@columns ||= {}
|
31
|
-
@columns[name.to_sym] = Column.new
|
31
|
+
@columns[name.to_sym] = Column.new(name, {
|
32
32
|
definition: definition,
|
33
33
|
getter: block
|
34
|
-
}
|
34
|
+
}, *args)
|
35
35
|
end
|
36
36
|
|
37
37
|
def columns
|
data/lib/devlin/version.rb
CHANGED
data/spec/query_spec.rb
CHANGED
@@ -19,6 +19,9 @@ describe TestReport do
|
|
19
19
|
group:
|
20
20
|
- manufacturer
|
21
21
|
- month
|
22
|
+
order:
|
23
|
+
month: asc
|
24
|
+
manufacturer: desc
|
22
25
|
EOF
|
23
26
|
end
|
24
27
|
|
@@ -29,20 +32,46 @@ describe TestReport do
|
|
29
32
|
rep.query(@q).select.should eq(['month', 'manufacturer', 'earnings'])
|
30
33
|
rep.query(@q).conditions.should eq('year' => 2012, 'month.geq' => 8, 'month.leq' => 10)
|
31
34
|
rep.query(@q).group.should eq(['manufacturer', 'month'])
|
35
|
+
rep.query(@q).order.should eq('month' => 'ASC', 'manufacturer' => 'DESC')
|
36
|
+
end # it
|
37
|
+
|
38
|
+
it 'should return an exception if no selections are given' do
|
39
|
+
rep = TestReport.new user_id: 1
|
40
|
+
expect {
|
41
|
+
rep.query('scope: transaction').select
|
42
|
+
}.should raise_error
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should return an empty hash if no conditions are given' do
|
46
|
+
rep = TestReport.new user_id: 1
|
47
|
+
rep.query('scope: transaction').conditions.should be_a(Hash)
|
48
|
+
rep.query('scope: transaction').conditions.should be_empty
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should return an empty hash if no conditions are given' do
|
52
|
+
rep = TestReport.new user_id: 1
|
53
|
+
rep.query('scope: transaction').group.should be_an(Array)
|
54
|
+
rep.query('scope: transaction').group.should be_empty
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'should return an empty hash if no order is given' do
|
58
|
+
rep = TestReport.new user_id: 1
|
59
|
+
rep.query('scope: transaction').order.should be_a(Hash)
|
60
|
+
rep.query('scope: transaction').order.should be_empty
|
32
61
|
end
|
33
62
|
|
34
63
|
describe 'result' do
|
35
64
|
it 'should only contain the selected columns' do
|
36
65
|
rep = TestReport.new user_id: 1
|
37
66
|
rep.query(@q).result.first.attributes.keys.map(&:to_sym).should eq([:month, :manufacturer, :earnings])
|
38
|
-
end
|
67
|
+
end # it
|
39
68
|
|
40
69
|
it 'should contain only results with months between 1 and 3' do
|
41
70
|
rep = TestReport.new user_id: 1
|
42
71
|
rep.query(@q).result.each do |r|
|
43
72
|
r.month.to_i.should be_between(8, 10)
|
44
73
|
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
74
|
+
end # it
|
75
|
+
end # describe 'result'
|
76
|
+
end # describe 'query'
|
48
77
|
end
|
data/spec/setup_spec.rb
CHANGED
@@ -37,6 +37,12 @@ describe TestReport do
|
|
37
37
|
scope = rep.scope(:transaction)
|
38
38
|
scope.column(:month).value(2).should eq('Feb')
|
39
39
|
end
|
40
|
+
|
41
|
+
it 'should contain the given additional arguments' do
|
42
|
+
rep = TestReport.new(user_id: 1)
|
43
|
+
scope = rep.scope(:transaction)
|
44
|
+
scope.column(:month).arguments.should eq({ :hallo => 'Welt' })
|
45
|
+
end
|
40
46
|
end
|
41
47
|
end
|
42
48
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -30,7 +30,7 @@ class TestReport < Devlin::Base
|
|
30
30
|
|
31
31
|
column :manufacturer, "manufacturer"
|
32
32
|
column :year, "CAST(strftime('%Y', date) AS INTEGER)"
|
33
|
-
column :month, "CAST(strftime('%m', date) AS INTEGER)" do |value|
|
33
|
+
column :month, "CAST(strftime('%m', date) AS INTEGER)", :hallo => 'Welt' do |value|
|
34
34
|
months = %W(~ Jan Feb Mar Apr May Jun Jul Aug Sep Okt Nov Dec)
|
35
35
|
months[value]
|
36
36
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: devlin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -66,7 +66,6 @@ files:
|
|
66
66
|
- spec/query_spec.rb
|
67
67
|
- spec/setup_spec.rb
|
68
68
|
- spec/spec_helper.rb
|
69
|
-
- spec/test.sqlite3
|
70
69
|
homepage: https://github.com/spieker/devlin
|
71
70
|
licenses: []
|
72
71
|
post_install_message:
|
@@ -98,5 +97,4 @@ test_files:
|
|
98
97
|
- spec/query_spec.rb
|
99
98
|
- spec/setup_spec.rb
|
100
99
|
- spec/spec_helper.rb
|
101
|
-
- spec/test.sqlite3
|
102
100
|
has_rdoc:
|
data/spec/test.sqlite3
DELETED
Binary file
|