yaml-file-db 0.1.2 → 0.1.7

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.
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
  - - ">="