metrix_db 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +1 -1
- data/README.md +9 -1
- data/lib/metrix_db/version.rb +1 -1
- data/lib/metrix_db.rb +21 -2
- data/spec/metrix_db/field_spec.rb +19 -0
- data/spec/metrix_db/where_spec.rb +2 -1
- metadata +3 -3
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -14,7 +14,7 @@ Usage
|
|
14
14
|
|
15
15
|
class MyDB
|
16
16
|
include MetrixDB
|
17
|
-
field :col1
|
17
|
+
field :col1, :uniq => false
|
18
18
|
field :col2
|
19
19
|
dataset [[1,2],[3,4]]
|
20
20
|
end
|
@@ -25,6 +25,14 @@ Usage
|
|
25
25
|
* Set dataset, dataset is the real data of one DB
|
26
26
|
|
27
27
|
|
28
|
+
Field
|
29
|
+
-----
|
30
|
+
|
31
|
+
Options for field definition
|
32
|
+
|
33
|
+
`uniq`: Check if column is unique. Default value is true.
|
34
|
+
|
35
|
+
|
28
36
|
Query
|
29
37
|
-----
|
30
38
|
|
data/lib/metrix_db/version.rb
CHANGED
data/lib/metrix_db.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
module MetrixDB
|
2
|
+
class UniqueFieldError < Exception; end
|
3
|
+
|
2
4
|
def self.included(base)
|
3
5
|
base.extend ClassMethods
|
4
6
|
base.send(:include, InstanceMethods)
|
@@ -11,9 +13,14 @@ module MetrixDB
|
|
11
13
|
end
|
12
14
|
|
13
15
|
module ClassMethods
|
14
|
-
def field(name)
|
16
|
+
def field(name, options = {})
|
17
|
+
default_options = {:uniq => true}
|
18
|
+
options = default_options.merge(options)
|
15
19
|
@fields ||= {}
|
16
|
-
|
20
|
+
index = @fields.size
|
21
|
+
@fields[name.to_sym] = index
|
22
|
+
@uniq_fields ||= {}
|
23
|
+
@uniq_fields[index] = name.to_s if options[:uniq]
|
17
24
|
define_method "#{name}" do
|
18
25
|
@data[self.class.fields[name.to_sym]]
|
19
26
|
end
|
@@ -25,9 +32,21 @@ module MetrixDB
|
|
25
32
|
|
26
33
|
def dataset(_dataset)
|
27
34
|
@dataset = _dataset
|
35
|
+
check_uniq_fields(_dataset)
|
36
|
+
end
|
37
|
+
|
38
|
+
def check_uniq_fields(_dataset)
|
39
|
+
return unless @uniq_fields
|
40
|
+
@uniq_fields.each_pair do |index, field_name|
|
41
|
+
col_data = _dataset.map {|data| data[index]}
|
42
|
+
if col_data.uniq!
|
43
|
+
raise UniqueFieldError.new("Field '#{field_name}' is not unique")
|
44
|
+
end
|
45
|
+
end
|
28
46
|
end
|
29
47
|
|
30
48
|
def where(conditions={})
|
49
|
+
return nil if @dataset.nil? || @fields.nil?
|
31
50
|
@dataset.each do |data|
|
32
51
|
conditions.each_pair do |k, v|
|
33
52
|
return self.new(data) if data[@fields[k.to_sym]] == v
|
@@ -28,4 +28,23 @@ describe MetrixDB do
|
|
28
28
|
ins.field2.should == 2
|
29
29
|
end
|
30
30
|
end
|
31
|
+
|
32
|
+
context "unique field" do
|
33
|
+
it "should raise exception if field is unique" do
|
34
|
+
lambda { @class = Class.new {
|
35
|
+
include MetrixDB
|
36
|
+
field :field
|
37
|
+
dataset [[1],[1]]
|
38
|
+
}}.should raise_error MetrixDB::UniqueFieldError, "Field 'field' is not unique"
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should not raise exception if field is not unique" do
|
42
|
+
lambda { @class = Class.new {
|
43
|
+
include MetrixDB
|
44
|
+
field :field, :uniq => false
|
45
|
+
dataset [[1],[1]]
|
46
|
+
}}.should_not raise_error
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
31
50
|
end
|
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe MetrixDB do
|
4
4
|
context ".where" do
|
5
5
|
before do
|
6
|
-
dataset = [[1,2],[2,3]]
|
6
|
+
dataset = [[1,2],[2,3]]
|
7
7
|
@dataset = dataset
|
8
8
|
@class = Class.new do
|
9
9
|
include MetrixDB
|
@@ -38,6 +38,7 @@ describe MetrixDB do
|
|
38
38
|
inst.col1.should == 1
|
39
39
|
inst.col2.should == 2
|
40
40
|
end
|
41
|
+
|
41
42
|
end
|
42
43
|
end
|
43
44
|
|
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: 25
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Allen Wei
|