yaml-file-db 0.1.2 → 0.1.7

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: cdec368220bb1f0c3075bc77ce04deee5d71b589dedfe4768c12a91c963b5373
4
- data.tar.gz: 64a96c084ff0d6a622c787c84632fb9163f8218151e1575a71b0ca02bc10413d
3
+ metadata.gz: ae6799ef62195b4c458d3f3cd47be139da5f7aef5b8e6dbd69fe6df64d9f52e4
4
+ data.tar.gz: 71b3d6392ebc40c100202f8660c5939a2584a2ac93773e61a808826b62e3e08a
5
5
  SHA512:
6
- metadata.gz: 83182ca75c22109d1e0a8c117cfae4d75551b9d6f363b4a244d596864fb9b6e657e49b29312ea1b235a0e607ca656a69238acbfa88a4359d7303994d16e7da69
7
- data.tar.gz: 2d7e1a93edefba627b2da0bb473398e35dd84343070268256eb3b198d60cfd3bb1b24ad0aa0f16fc621efb1fb8c117ee39f2c9b8b7e9dff2d6d4ac69611df987
6
+ metadata.gz: 25ef22935b21a47f905646f8ce633db3f657e77f4cfdbaf2fff1abf547c1c7b92edf5297bb91f34ed864d27beab61e1302742b497026378b850d35884ae8d823
7
+ data.tar.gz: 11642c1d417335cf217867b8e32d60e30c6ee26d86dd1adbd50be740115af846ef0ad57482a4afa839e94e50366d1d7ad47cf3f93dd8f98ffb495a573ce707cf
data/lib/yaml-file-db.rb CHANGED
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'active_support/inflector'
2
4
  require 'json-schema'
3
5
  require 'yaml'
4
6
 
5
- require 'yaml-file-db/database.rb'
6
- require 'yaml-file-db/exception.rb'
7
- require 'yaml-file-db/row.rb'
7
+ require 'yaml-file-db/database'
8
+ require 'yaml-file-db/exception'
9
+ require 'yaml-file-db/row'
@@ -1,7 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module YDB
2
4
  class Database
3
-
4
- INTERNAL_VARS = [:@errors, :@schemas, :@source].freeze
5
+ INTERNAL_VARS = %i[@errors @schemas @source].freeze
5
6
 
6
7
  attr_reader :errors, :schemas, :source
7
8
 
@@ -11,16 +12,16 @@ module YDB
11
12
  @source = source
12
13
  end
13
14
 
14
- def build()
15
- build_tables()
16
- build_relationships()
17
- check_relationships()
15
+ def build
16
+ build_tables
17
+ build_relationships
18
+ check_relationships
18
19
  self
19
20
  end
20
21
 
21
22
  private
22
23
 
23
- def build_tables()
24
+ def build_tables
24
25
  Dir["#{@source}/*"].each do |table_path|
25
26
  table = {}
26
27
 
@@ -30,57 +31,51 @@ module YDB
30
31
  schema_path = "#{@schemas}/#{table_name.singularize}.yml"
31
32
 
32
33
  Dir["#{table_path}/*.yml"].each do |source|
33
- begin
34
- row = Object.const_get(klass_name).new(source, schema_path)
35
- table[row.id] = row
36
- rescue ValidationError => error
37
- @errors << "#{source}: #{error.to_s}"
38
- end
34
+ row = Object.const_get(klass_name).new(source, schema_path)
35
+ table[row.id] = row
36
+ rescue ValidationError => e
37
+ @errors << "[#{source.split('/')[-3..].join('/')}] #{e}"
39
38
  end
40
39
 
41
40
  instance_variable_set("@#{table_name}", table)
42
- self.class.send("attr_reader", table_name.to_sym)
41
+ self.class.send('attr_reader', table_name.to_sym)
43
42
  end
44
43
  end
45
44
 
46
- def build_relationships()
45
+ def build_relationships
47
46
  keywords = keywords()
48
47
  iterate_over_rows do |row|
49
48
  row.build_relationships(self, keywords)
50
49
  end
51
50
  end
52
51
 
53
- def check_relationships()
52
+ def check_relationships
54
53
  keywords = keywords()
55
54
  iterate_over_rows do |row|
56
55
  row.check_relationships(self, keywords)
57
56
  end
58
57
  end
59
58
 
60
- private
61
-
62
- def keywords()
59
+ def keywords
63
60
  keywords = []
64
- (self.instance_variables - INTERNAL_VARS).each do |var|
65
- keywords << var.to_s[1..-1]
66
- keywords << var.to_s[1..-1].singularize
61
+ (instance_variables - INTERNAL_VARS).each do |var|
62
+ keywords << var.to_s[1..]
63
+ keywords << var.to_s[1..].singularize
67
64
  end
68
65
  keywords
69
66
  end
70
67
 
71
68
  def iterate_over_rows(&block)
72
- self.instance_variables.each do |var|
69
+ instance_variables.each do |var|
73
70
  next if INTERNAL_VARS.include? var
71
+
74
72
  table = instance_variable_get var
75
- table.each do |id, row|
76
- begin
77
- block.call(row)
78
- rescue ValidationError => error
79
- @errors << "#{row.source}: #{error.to_s}"
73
+ table.each do |_id, row|
74
+ block.call(row).each do |error|
75
+ @errors << "[#{row.source.split('/')[-3..].join('/')}] #{error}"
80
76
  end
81
77
  end
82
78
  end
83
79
  end
84
-
85
80
  end
86
81
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module YDB
2
4
  class ValidationError < StandardError
3
5
  end
@@ -1,18 +1,21 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module YDB
2
4
  class Row
3
- INTERNAL_VARS = [:@id, :@source].freeze
5
+ INTERNAL_VARS = %i[@id @source].freeze
4
6
 
5
7
  attr_reader :id, :source
6
8
 
7
9
  def initialize(source, schema_path)
8
- @id = File.basename(source, ".yml")
10
+ @id = File.basename(source, '.yml')
9
11
  @source = source
10
12
 
11
- validate_filename()
13
+ validate_filename
12
14
  build(source, schema_path)
13
15
  end
14
16
 
15
17
  def build_relationships(db, keywords)
18
+ errors = []
16
19
  iterate_over_columns do |key, value|
17
20
  if keywords.include?(key)
18
21
  if key.pluralize == key
@@ -20,71 +23,82 @@ module YDB
20
23
  table = db.public_send(key.to_sym)
21
24
  value.each do |primary_key|
22
25
  row = table[primary_key]
23
- raise ValidationError.new("invalid primary_key: #{primary_key} is not part of #{key}") if row.nil?
26
+ errors << "Invalid primary_key: #{primary_key} isn't part of table #{key}" if row.nil?
24
27
  rows << row
25
28
  end
26
29
  instance_variable_set("@#{key}", rows)
27
30
  else
28
31
  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?
32
+ errors << "Invalid primary_key: #{value} isn't part of table #{key.pluralize}" if row.nil?
30
33
  instance_variable_set("@#{key}", row)
31
34
  end
32
35
  end
33
36
  end
37
+ errors
34
38
  end
35
39
 
36
- def check_relationships(db, keywords)
40
+ def check_relationships(_db, keywords)
41
+ errors = []
37
42
  iterate_over_columns do |key, value|
38
43
  if keywords.include?(key)
39
- # move row into array to make it iterable
44
+ next if value.nil?
45
+
40
46
  value = [value] if value.is_a?(YDB::Row)
41
47
  value.each do |row|
42
48
  if row.respond_to?(self.class.to_s.downcase.to_sym)
43
49
  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}")
50
+ errors << "Inconsistent relationship: #{row.id} doesn't link back to #{id}"
45
51
  end
46
52
  elsif row.respond_to?(self.class.to_s.downcase.pluralize.to_sym)
47
53
  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}")
54
+ errors << "Inconsistent relationship: #{row.id} doesn't link back to #{id}"
49
55
  end
50
56
  end
51
57
  end
52
58
  end
53
59
  end
60
+ errors
54
61
  end
55
62
 
56
63
  private
57
64
 
58
65
  def build(source, schema_path)
59
- doc = YAML.load(File.read(source))
60
- raise ValidationError.new("invalid YAML") if doc == false
66
+ begin
67
+ doc = YAML.safe_load(File.read(source))
68
+ rescue Psych::SyntaxError => e
69
+ raise ValidationError, "Invalid YAML document: #{e.message}"
70
+ end
71
+ raise ValidationError, 'Blank YAML document' if doc.nil?
61
72
 
62
- schema = YAML.load(File.read(schema_path))
73
+ schema = YAML.safe_load(File.read(schema_path))
63
74
  begin
64
- JSON::Validator.validate!(schema, doc, :parse_data => false)
65
- rescue JSON::Schema::ValidationError => error
66
- raise ValidationError.new("invalid data (#{error.message})")
75
+ JSON::Validator.validate!(schema, doc, parse_data: false)
76
+ rescue JSON::Schema::ValidationError => e
77
+ raise ValidationError, "Invalid data: #{e.message}"
67
78
  end
68
79
 
69
80
  doc.each do |name, value|
70
81
  instance_variable_set("@#{name}", value)
71
- next if self.respond_to?(name.to_sym)
72
- self.class.send("attr_reader", name.to_sym)
82
+ next if respond_to?(name.to_sym)
83
+
84
+ self.class.send('attr_reader', name.to_sym)
73
85
  end
74
86
  end
75
87
 
76
88
  def iterate_over_columns(&block)
77
- self.instance_variables.each do |var|
89
+ instance_variables.each do |var|
78
90
  next if INTERNAL_VARS.include?(var)
79
- key = var.to_s[1..-1]
91
+
92
+ key = var.to_s[1..]
80
93
  value = instance_variable_get(var)
81
94
  block.call(key, value)
82
95
  end
83
96
  end
84
97
 
85
- def validate_filename()
86
- raise ValidationError.new("invalid filename") unless self.id =~ /^[\w-]+$/
87
- end
98
+ def validate_filename
99
+ return if id =~ /\A[a-z\d][a-z\d-]*[a-z\d]\z/i
88
100
 
101
+ raise ValidationError, "Invalid filename: #{id} doesn't follow dash-case convention"
102
+ end
89
103
  end
90
104
  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.2
4
+ version: 0.1.7
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-23 00:00:00.000000000 Z
11
+ date: 2021-03-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -72,7 +72,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: 2.6.0
76
76
  required_rubygems_version: !ruby/object:Gem::Requirement
77
77
  requirements:
78
78
  - - ">="