yaml-file-db 0.1.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: dcccc03ffdf919d10a071489113df40c30a6bdc7895648b333ce3fc892a95322
4
+ data.tar.gz: 9a5b1b311ed1cf15c73ecdc5fe2e33bd2e3471973d7909569d25881f579081b8
5
+ SHA512:
6
+ metadata.gz: c8569acad2ff389a8827dfb4203aa56525de1465849f01be2fa3f1f04742015d8fc615bf7c778f463ad8e752ceee1254928d268e3e3ee7568e704a5f4f2cd340
7
+ data.tar.gz: c4189b21b1b971969a0f2dfe3d2bb48ca181689f827b8e4bedefdd1033bb263f531c7248da2a364ef7d23d195ef802a58f2bb1c8f4ebd6ac4e668212e96684a8
@@ -0,0 +1,65 @@
1
+ module YDB
2
+ class Database
3
+
4
+ INTERNAL_VARS = [:@errors, :@schemas, :@source].freeze
5
+
6
+ attr_reader :errors, :schemas, :source
7
+
8
+ def initialize(source, schemas)
9
+ @errors = []
10
+ @schemas = schemas
11
+ @source = source
12
+ end
13
+
14
+ def build()
15
+ build_tables()
16
+ build_relationships()
17
+ self
18
+ end
19
+
20
+ private
21
+
22
+ def build_tables()
23
+ Dir["#{@source}/*"].each do |table_path|
24
+ table = {}
25
+
26
+ table_name = File.basename(table_path)
27
+ klass_name = table_name.singularize.capitalize
28
+ Object.const_set(klass_name, Class.new(Row))
29
+ schema_path = "#{@schemas}/#{table_name.singularize}.yml"
30
+
31
+ Dir["#{table_path}/*.yml"].each do |source|
32
+ begin
33
+ row = Object.const_get(klass_name).new(source, schema_path)
34
+ table[row.id] = row
35
+ rescue ValidationError => error
36
+ @errors << "#{source}: #{error.to_s}"
37
+ end
38
+ end
39
+
40
+ instance_variable_set("@#{table_name}", table)
41
+ self.class.send("attr_reader", table_name.to_sym)
42
+ end
43
+ end
44
+
45
+ def build_relationships()
46
+ keywords = []
47
+ (self.instance_variables - INTERNAL_VARS).each do |var|
48
+ keywords << var.to_s[1..-1]
49
+ keywords << var.to_s[1..-1].singularize
50
+ end
51
+ self.instance_variables.each do |var|
52
+ next if INTERNAL_VARS.include? var
53
+ table = instance_variable_get var
54
+ table.each do |id, row|
55
+ begin
56
+ row.build_relationships(self, keywords)
57
+ rescue ValidationError => error
58
+ @errors << "#{row.source}: #{error.to_s}"
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ end
65
+ end
@@ -0,0 +1,4 @@
1
+ module YDB
2
+ class ValidationError < StandardError
3
+ end
4
+ end
@@ -0,0 +1,66 @@
1
+ module YDB
2
+ class Row
3
+ INTERNAL_VARS = [:@id, :@source].freeze
4
+
5
+ attr_reader :id, :source
6
+
7
+ def initialize(source, schema_path)
8
+ @id = File.basename(source, ".yml")
9
+ @source = source
10
+
11
+ validate_filename()
12
+ build(source, schema_path)
13
+ end
14
+
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
29
+ end
30
+ instance_variable_set("@#{keyword}", value)
31
+ 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)
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def build(source, schema_path)
44
+ doc = YAML.load(File.read(source))
45
+ raise ValidationError.new("invalid YAML") if doc == false
46
+
47
+ schema = YAML.load(File.read(schema_path))
48
+ begin
49
+ JSON::Validator.validate!(schema, doc, :parse_data => false)
50
+ rescue JSON::Schema::ValidationError => error
51
+ raise ValidationError.new("invalid data (#{error.message})")
52
+ end
53
+
54
+ doc.each do |name, value|
55
+ instance_variable_set("@#{name}", value)
56
+ next if self.respond_to? name.to_sym
57
+ self.class.send("attr_reader", name.to_sym)
58
+ end
59
+ end
60
+
61
+ def validate_filename()
62
+ raise ValidationError.new("invalid filename") unless self.id =~ /^[\w-]+$/
63
+ end
64
+
65
+ end
66
+ end
@@ -0,0 +1,7 @@
1
+ require 'active_support/inflector'
2
+ require 'json-schema'
3
+ require 'yaml'
4
+
5
+ require 'yaml-file-db/database.rb'
6
+ require 'yaml-file-db/exception.rb'
7
+ require 'yaml-file-db/row.rb'
metadata ADDED
@@ -0,0 +1,86 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: yaml-file-db
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Louis-Philippe Gauthier
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-02-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">"
18
+ - !ruby/object:Gem::Version
19
+ version: 6.0.0
20
+ - - "~>"
21
+ - !ruby/object:Gem::Version
22
+ version: '6.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">"
28
+ - !ruby/object:Gem::Version
29
+ version: 6.0.0
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '6.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: json-schema
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '2.8'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 2.8.1
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '2.8'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 2.8.1
53
+ description: YAML file database
54
+ email: lpgauth@gmail.com
55
+ executables: []
56
+ extensions: []
57
+ extra_rdoc_files: []
58
+ files:
59
+ - lib/yaml-file-db.rb
60
+ - lib/yaml-file-db/database.rb
61
+ - lib/yaml-file-db/exception.rb
62
+ - lib/yaml-file-db/row.rb
63
+ homepage: https://rubygems.org/gems/yaml-file-db
64
+ licenses:
65
+ - MIT
66
+ metadata: {}
67
+ post_install_message:
68
+ rdoc_options: []
69
+ require_paths:
70
+ - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ requirements: []
82
+ rubygems_version: 3.0.3
83
+ signing_key:
84
+ specification_version: 4
85
+ summary: database
86
+ test_files: []