metrix_db 0.0.4 → 0.0.5
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/Gemfile.lock +1 -1
- data/README.md +7 -1
- data/lib/metrix_db.rb +13 -1
- data/lib/metrix_db/version.rb +1 -1
- data/spec/metrix_db/data_spec.rb +1 -0
- data/spec/metrix_db/field_spec.rb +30 -1
- data/spec/metrix_db/{first_spec.rb → query_spec.rb} +13 -1
- metadata +5 -5
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -15,7 +15,7 @@ Usage
|
|
15
15
|
class MyDB
|
16
16
|
include MetrixDB
|
17
17
|
field :col1, :uniq => false
|
18
|
-
field :col2
|
18
|
+
field :col2, :ref => true
|
19
19
|
dataset [[1,2],[3,4]]
|
20
20
|
end
|
21
21
|
|
@@ -31,6 +31,7 @@ Field
|
|
31
31
|
Options for field definition
|
32
32
|
|
33
33
|
`uniq`: Check if column is unique. Default value is true.
|
34
|
+
`ref`: Support `[]` query syntax. If not set for all field will use first field as ref field
|
34
35
|
|
35
36
|
|
36
37
|
Query
|
@@ -45,6 +46,11 @@ or alias :one
|
|
45
46
|
mydb = MyDB.on(:col1 => 1) # nil or instance of MyDB.
|
46
47
|
mydb.col1 # => 1
|
47
48
|
mydb.col2 # => 2
|
49
|
+
|
50
|
+
use `[]` as query syntax, it will use ref field to query data.
|
51
|
+
|
52
|
+
mydb = MyDB.[1] # nil or instance of MyDB.
|
53
|
+
|
48
54
|
|
49
55
|
|
50
56
|
|
data/lib/metrix_db.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
module MetrixDB
|
2
2
|
class UniqueFieldError < Exception; end
|
3
|
+
class UsageError < Exception; end
|
3
4
|
|
4
5
|
def self.included(base)
|
5
6
|
base.extend ClassMethods
|
@@ -19,19 +20,25 @@ module MetrixDB
|
|
19
20
|
@fields ||= {}
|
20
21
|
index = @fields.size
|
21
22
|
@fields[name.to_sym] = index
|
23
|
+
|
22
24
|
@uniq_fields ||= {}
|
23
25
|
@uniq_fields[index] = name.to_s if options[:uniq]
|
26
|
+
|
27
|
+
raise UsageError.new("Already defined '#{@ref_field}' as ref column") if options[:ref] && @ref_field
|
28
|
+
@ref_field = name.to_sym if options[:ref]
|
29
|
+
|
24
30
|
define_method "#{name}" do
|
25
31
|
@data[self.class.fields[name.to_sym]]
|
26
32
|
end
|
27
33
|
end
|
28
34
|
|
29
35
|
def fields
|
30
|
-
@fields ||=
|
36
|
+
@fields ||= {}
|
31
37
|
end
|
32
38
|
|
33
39
|
def dataset(_dataset)
|
34
40
|
@dataset = _dataset
|
41
|
+
@ref_field ||= @fields.keys.first
|
35
42
|
check_uniq_fields(_dataset)
|
36
43
|
end
|
37
44
|
|
@@ -52,7 +59,12 @@ module MetrixDB
|
|
52
59
|
return self.new(data) if data[@fields[k.to_sym]] == v
|
53
60
|
end
|
54
61
|
end
|
62
|
+
return nil
|
55
63
|
end
|
56
64
|
alias :on :first
|
65
|
+
|
66
|
+
def [](value)
|
67
|
+
self.first(@ref_field => value)
|
68
|
+
end
|
57
69
|
end
|
58
70
|
end
|
data/lib/metrix_db/version.rb
CHANGED
data/spec/metrix_db/data_spec.rb
CHANGED
@@ -47,7 +47,36 @@ describe MetrixDB do
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
context "" do
|
50
|
+
context "ref index" do
|
51
|
+
it "should use first field as ref field" do
|
52
|
+
klass = Class.new do
|
53
|
+
include MetrixDB
|
54
|
+
field :field1
|
55
|
+
field :field2
|
56
|
+
dataset [[1,2],[2,3]]
|
57
|
+
end
|
58
|
+
|
59
|
+
klass.instance_variable_get("@ref_field").should == :field1
|
60
|
+
end
|
61
|
+
|
62
|
+
it "can set ref field" do
|
63
|
+
klass = Class.new do
|
64
|
+
include MetrixDB
|
65
|
+
field :field1
|
66
|
+
field :field2, :ref => true
|
67
|
+
dataset [[1,2],[2,3]]
|
68
|
+
end
|
69
|
+
klass.instance_variable_get("@ref_field").should == :field2
|
70
|
+
end
|
71
|
+
|
72
|
+
it "will raise error if define two ref field" do
|
73
|
+
lambda {Class.new {
|
74
|
+
include MetrixDB
|
75
|
+
field :field1, :ref => true
|
76
|
+
field :field2, :ref => true
|
77
|
+
dataset [[1,2],[2,3]]
|
78
|
+
}}.should raise_error MetrixDB::UsageError, "Already defined 'field1' as ref column"
|
79
|
+
end
|
51
80
|
|
52
81
|
end
|
53
82
|
end
|
@@ -38,7 +38,19 @@ describe MetrixDB do
|
|
38
38
|
inst.col1.should == 1
|
39
39
|
inst.col2.should == 2
|
40
40
|
end
|
41
|
-
|
42
41
|
end
|
42
|
+
|
43
|
+
context "ref query syntax []" do
|
44
|
+
it "use first field as search key" do
|
45
|
+
klass = Class.new do
|
46
|
+
include MetrixDB
|
47
|
+
field :field1
|
48
|
+
field :field2
|
49
|
+
dataset [[1,2],[2,3]]
|
50
|
+
end
|
51
|
+
klass[2].data.should == [2,3]
|
52
|
+
klass[123].should be_nil
|
53
|
+
end
|
54
|
+
end
|
43
55
|
end
|
44
56
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: metrix_db
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 5
|
10
|
+
version: 0.0.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Allen Wei
|
@@ -68,7 +68,7 @@ files:
|
|
68
68
|
- metrix_db.gemspec
|
69
69
|
- spec/metrix_db/data_spec.rb
|
70
70
|
- spec/metrix_db/field_spec.rb
|
71
|
-
- spec/metrix_db/
|
71
|
+
- spec/metrix_db/query_spec.rb
|
72
72
|
- spec/metrix_db_spec.rb
|
73
73
|
- spec/spec_helper.rb
|
74
74
|
has_rdoc: true
|
@@ -108,6 +108,6 @@ summary: Simple DB base on Ruby Array
|
|
108
108
|
test_files:
|
109
109
|
- spec/metrix_db/data_spec.rb
|
110
110
|
- spec/metrix_db/field_spec.rb
|
111
|
-
- spec/metrix_db/
|
111
|
+
- spec/metrix_db/query_spec.rb
|
112
112
|
- spec/metrix_db_spec.rb
|
113
113
|
- spec/spec_helper.rb
|