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 CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- metrix_db (0.0.1)
4
+ metrix_db (0.0.2)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
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
 
@@ -1,3 +1,3 @@
1
1
  module MetrixDb
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
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
- @fields[name.to_sym] = @fields.size
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: 27
4
+ hash: 25
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Allen Wei