yaml-file-db 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dcccc03ffdf919d10a071489113df40c30a6bdc7895648b333ce3fc892a95322
4
- data.tar.gz: 9a5b1b311ed1cf15c73ecdc5fe2e33bd2e3471973d7909569d25881f579081b8
3
+ metadata.gz: cdec368220bb1f0c3075bc77ce04deee5d71b589dedfe4768c12a91c963b5373
4
+ data.tar.gz: 64a96c084ff0d6a622c787c84632fb9163f8218151e1575a71b0ca02bc10413d
5
5
  SHA512:
6
- metadata.gz: c8569acad2ff389a8827dfb4203aa56525de1465849f01be2fa3f1f04742015d8fc615bf7c778f463ad8e752ceee1254928d268e3e3ee7568e704a5f4f2cd340
7
- data.tar.gz: c4189b21b1b971969a0f2dfe3d2bb48ca181689f827b8e4bedefdd1033bb263f531c7248da2a364ef7d23d195ef802a58f2bb1c8f4ebd6ac4e668212e96684a8
6
+ metadata.gz: 83182ca75c22109d1e0a8c117cfae4d75551b9d6f363b4a244d596864fb9b6e657e49b29312ea1b235a0e607ca656a69238acbfa88a4359d7303994d16e7da69
7
+ data.tar.gz: 2d7e1a93edefba627b2da0bb473398e35dd84343070268256eb3b198d60cfd3bb1b24ad0aa0f16fc621efb1fb8c117ee39f2c9b8b7e9dff2d6d4ac69611df987
@@ -14,6 +14,7 @@ module YDB
14
14
  def build()
15
15
  build_tables()
16
16
  build_relationships()
17
+ check_relationships()
17
18
  self
18
19
  end
19
20
 
@@ -43,17 +44,37 @@ module YDB
43
44
  end
44
45
 
45
46
  def build_relationships()
47
+ keywords = keywords()
48
+ iterate_over_rows do |row|
49
+ row.build_relationships(self, keywords)
50
+ end
51
+ end
52
+
53
+ def check_relationships()
54
+ keywords = keywords()
55
+ iterate_over_rows do |row|
56
+ row.check_relationships(self, keywords)
57
+ end
58
+ end
59
+
60
+ private
61
+
62
+ def keywords()
46
63
  keywords = []
47
64
  (self.instance_variables - INTERNAL_VARS).each do |var|
48
65
  keywords << var.to_s[1..-1]
49
66
  keywords << var.to_s[1..-1].singularize
50
67
  end
68
+ keywords
69
+ end
70
+
71
+ def iterate_over_rows(&block)
51
72
  self.instance_variables.each do |var|
52
73
  next if INTERNAL_VARS.include? var
53
74
  table = instance_variable_get var
54
75
  table.each do |id, row|
55
76
  begin
56
- row.build_relationships(self, keywords)
77
+ block.call(row)
57
78
  rescue ValidationError => error
58
79
  @errors << "#{row.source}: #{error.to_s}"
59
80
  end
@@ -13,26 +13,41 @@ module YDB
13
13
  end
14
14
 
15
15
  def build_relationships(db, keywords)
16
- self.instance_variables.each do |var|
17
- next if INTERNAL_VARS.include? var
18
- keyword = var.to_s[1..-1]
19
-
20
- if keywords.include? keyword
21
- if keyword.pluralize == keyword
22
- array = instance_variable_get var
23
- entities = db.public_send(keyword.to_sym)
24
- value = []
25
- array.each do |primary_key|
26
- entity = entities[primary_key]
27
- raise ValidationError.new("invalid primary_key #{primary_key}") if entity.nil?
28
- value << entity
16
+ iterate_over_columns do |key, value|
17
+ if keywords.include?(key)
18
+ if key.pluralize == key
19
+ rows = []
20
+ table = db.public_send(key.to_sym)
21
+ value.each do |primary_key|
22
+ row = table[primary_key]
23
+ raise ValidationError.new("invalid primary_key: #{primary_key} is not part of #{key}") if row.nil?
24
+ rows << row
29
25
  end
30
- instance_variable_set("@#{keyword}", value)
26
+ instance_variable_set("@#{key}", rows)
31
27
  else
32
- primary_key = instance_variable_get var
33
- entity = db.public_send(keyword.pluralize.to_sym)[primary_key]
34
- raise ValidationError.new("invalid primary_key #{primary_key}") if entity.nil?
35
- instance_variable_set("@#{keyword}", entity)
28
+ row = db.public_send(key.pluralize.to_sym)[value]
29
+ raise ValidationError.new("invalid primary_key: #{primary_key} is not part of #{key}") if row.nil?
30
+ instance_variable_set("@#{key}", row)
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ def check_relationships(db, keywords)
37
+ iterate_over_columns do |key, value|
38
+ if keywords.include?(key)
39
+ # move row into array to make it iterable
40
+ value = [value] if value.is_a?(YDB::Row)
41
+ value.each do |row|
42
+ if row.respond_to?(self.class.to_s.downcase.to_sym)
43
+ unless row.public_send(self.class.to_s.downcase.to_sym) == self
44
+ raise ValidationError.new("inconsistent relationship: #{row.id} doesn't link back to #{self.id}")
45
+ end
46
+ elsif row.respond_to?(self.class.to_s.downcase.pluralize.to_sym)
47
+ unless row.public_send(self.class.to_s.downcase.pluralize.to_sym).include?(self)
48
+ raise ValidationError.new("inconsistent relationship: #{row.id} doesn't link back to #{self.id}")
49
+ end
50
+ end
36
51
  end
37
52
  end
38
53
  end
@@ -53,11 +68,20 @@ module YDB
53
68
 
54
69
  doc.each do |name, value|
55
70
  instance_variable_set("@#{name}", value)
56
- next if self.respond_to? name.to_sym
71
+ next if self.respond_to?(name.to_sym)
57
72
  self.class.send("attr_reader", name.to_sym)
58
73
  end
59
74
  end
60
75
 
76
+ def iterate_over_columns(&block)
77
+ self.instance_variables.each do |var|
78
+ next if INTERNAL_VARS.include?(var)
79
+ key = var.to_s[1..-1]
80
+ value = instance_variable_get(var)
81
+ block.call(key, value)
82
+ end
83
+ end
84
+
61
85
  def validate_filename()
62
86
  raise ValidationError.new("invalid filename") unless self.id =~ /^[\w-]+$/
63
87
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yaml-file-db
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Louis-Philippe Gauthier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-15 00:00:00.000000000 Z
11
+ date: 2021-02-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport