yaml-file-db 0.1.3 → 0.1.4
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 +4 -4
- data/lib/yaml-file-db.rb +5 -3
- data/lib/yaml-file-db/database.rb +25 -30
- data/lib/yaml-file-db/exception.rb +2 -0
- data/lib/yaml-file-db/row.rb +28 -21
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: becc9d0085a685c6a7b47e8d2fb32a372a6dd0d4af6f7bfc58b02ff896c8c90b
|
4
|
+
data.tar.gz: 6180250656d4c32731e5a77a9127fd17982b9fa48c0bcbff535c4575797890a8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4daf28abf27d81095e879eeac57d356315becbf88ccc30c6eed43fdeda22562f018554001e82120cb2a43209b1a8b05957342c3e07bc19f3496f31b6fd66c55b
|
7
|
+
data.tar.gz: 938c7c4a1c69ed176b0417346c87a35dbede5ec505f6b97c40a956caaedd9c4233885d8bfec95e005317680161d8bb4fbd980b55d9b4cff478d3abb3a98584fb
|
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
|
6
|
-
require 'yaml-file-db/exception
|
7
|
-
require 'yaml-file-db/row
|
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
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
@errors << "[#{source.split("/")[-3..-1].join("/")}] #{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(
|
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
|
-
|
61
|
-
|
62
|
-
def keywords()
|
59
|
+
def keywords
|
63
60
|
keywords = []
|
64
|
-
(
|
65
|
-
keywords << var.to_s[1
|
66
|
-
keywords << var.to_s[1
|
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
|
-
|
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 |
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
@errors << "[#{row.source.split("/")[-3..-1].join("/")}] #{error.to_s}"
|
80
|
-
end
|
73
|
+
table.each do |_id, row|
|
74
|
+
block.call(row)
|
75
|
+
rescue ValidationError => e
|
76
|
+
@errors << "[#{row.source.split('/')[-3..].join('/')}] #{e}"
|
81
77
|
end
|
82
78
|
end
|
83
79
|
end
|
84
|
-
|
85
80
|
end
|
86
81
|
end
|
data/lib/yaml-file-db/row.rb
CHANGED
@@ -1,14 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module YDB
|
2
4
|
class Row
|
3
|
-
INTERNAL_VARS = [
|
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,
|
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
|
|
@@ -20,20 +22,22 @@ module YDB
|
|
20
22
|
table = db.public_send(key.to_sym)
|
21
23
|
value.each do |primary_key|
|
22
24
|
row = table[primary_key]
|
23
|
-
raise ValidationError
|
25
|
+
raise ValidationError, "Invalid primary_key: #{primary_key} isn't part of table #{key}" if row.nil?
|
26
|
+
|
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
|
32
|
+
raise ValidationError, "Invalid primary_key: #{primary_key} isn't part of table #{key}" if row.nil?
|
33
|
+
|
30
34
|
instance_variable_set("@#{key}", row)
|
31
35
|
end
|
32
36
|
end
|
33
37
|
end
|
34
38
|
end
|
35
39
|
|
36
|
-
def check_relationships(
|
40
|
+
def check_relationships(_db, keywords)
|
37
41
|
iterate_over_columns do |key, value|
|
38
42
|
if keywords.include?(key)
|
39
43
|
# move row into array to make it iterable
|
@@ -41,11 +45,11 @@ module YDB
|
|
41
45
|
value.each do |row|
|
42
46
|
if row.respond_to?(self.class.to_s.downcase.to_sym)
|
43
47
|
unless row.public_send(self.class.to_s.downcase.to_sym) == self
|
44
|
-
raise ValidationError
|
48
|
+
raise ValidationError, "Inconsistent relationship: #{row.id} doesn't link back to #{id}"
|
45
49
|
end
|
46
50
|
elsif row.respond_to?(self.class.to_s.downcase.pluralize.to_sym)
|
47
51
|
unless row.public_send(self.class.to_s.downcase.pluralize.to_sym).include?(self)
|
48
|
-
raise ValidationError
|
52
|
+
raise ValidationError, "Inconsistent relationship: #{row.id} doesn't link back to #{id}"
|
49
53
|
end
|
50
54
|
end
|
51
55
|
end
|
@@ -56,35 +60,38 @@ module YDB
|
|
56
60
|
private
|
57
61
|
|
58
62
|
def build(source, schema_path)
|
59
|
-
doc = YAML.
|
60
|
-
raise ValidationError
|
63
|
+
doc = YAML.safe_load(File.read(source))
|
64
|
+
raise ValidationError, 'Invalid YAML document' if doc.nil?
|
61
65
|
|
62
|
-
schema = YAML.
|
66
|
+
schema = YAML.safe_load(File.read(schema_path))
|
63
67
|
begin
|
64
|
-
JSON::Validator.validate!(schema, doc, :
|
65
|
-
rescue JSON::Schema::ValidationError =>
|
66
|
-
raise ValidationError
|
68
|
+
JSON::Validator.validate!(schema, doc, parse_data: false)
|
69
|
+
rescue JSON::Schema::ValidationError => e
|
70
|
+
raise ValidationError, "Invalid data: #{e.message}"
|
67
71
|
end
|
68
72
|
|
69
73
|
doc.each do |name, value|
|
70
74
|
instance_variable_set("@#{name}", value)
|
71
|
-
next if
|
72
|
-
|
75
|
+
next if respond_to?(name.to_sym)
|
76
|
+
|
77
|
+
self.class.send('attr_reader', name.to_sym)
|
73
78
|
end
|
74
79
|
end
|
75
80
|
|
76
81
|
def iterate_over_columns(&block)
|
77
|
-
|
82
|
+
instance_variables.each do |var|
|
78
83
|
next if INTERNAL_VARS.include?(var)
|
79
|
-
|
84
|
+
|
85
|
+
key = var.to_s[1..]
|
80
86
|
value = instance_variable_get(var)
|
81
87
|
block.call(key, value)
|
82
88
|
end
|
83
89
|
end
|
84
90
|
|
85
|
-
def validate_filename
|
86
|
-
|
87
|
-
end
|
91
|
+
def validate_filename
|
92
|
+
return if id =~ /\A[a-z\d][a-z\d-]*[a-z\d]\z/i
|
88
93
|
|
94
|
+
raise ValidationError, "Invalid filename: #{id} doesn't follow dash-case convention"
|
95
|
+
end
|
89
96
|
end
|
90
97
|
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.
|
4
|
+
version: 0.1.4
|
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-
|
11
|
+
date: 2021-03-01 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:
|
75
|
+
version: 2.6.0
|
76
76
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
77
|
requirements:
|
78
78
|
- - ">="
|