strong_yaml 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 4d9fbf0e956d82b087df9a89ee34ed584b87bd15dd96fd69bb3fa7bc4c23568a
4
+ data.tar.gz: 9ac87edf2ff09038300c7b74f7171332f9e8f4379f9d0daa1a01693aaf70eea1
5
+ SHA512:
6
+ metadata.gz: b524ca35ed3137d72309934f9287fef33d62da0fb77a1303850b7420013c319b1d06520441f614a50b32ffaf9a0e5ef454036a4accb1cdc4842cf831627d7c12
7
+ data.tar.gz: ac3613443faf96bfcaa0e960f36f66aafb35275fac07a3f1684b57287c6d757108d5a6cfe2b67835db421e38889b7e4adbc8a720f9570bfbd8ff4f03e3b521cb
@@ -0,0 +1,32 @@
1
+ require_relative "config_string"
2
+ require_relative "config_integer"
3
+ require_relative "config_list"
4
+
5
+ module StrongYAML
6
+ class ConfigGroup
7
+ attr_reader :name, :elements
8
+
9
+ def initialize(name)
10
+ @name = name
11
+ @elements = []
12
+ end
13
+
14
+ def group(name, &block)
15
+ group = StrongYAML::ConfigGroup.new(name)
16
+ @elements << group
17
+ group.instance_eval(&block)
18
+ end
19
+
20
+ def string(name, **args)
21
+ @elements << StrongYAML::ConfigString.new(name, **args)
22
+ end
23
+
24
+ def integer(name, **args)
25
+ @elements << StrongYAML::ConfigInteger.new(name, **args)
26
+ end
27
+
28
+ def list(name, **args)
29
+ @elements << StrongYAML::ConfigList.new(name, **args)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,10 @@
1
+ module StrongYAML
2
+ class ConfigInteger
3
+ attr_reader :name, :default
4
+
5
+ def initialize(name, default: nil)
6
+ @name = name
7
+ @default = default
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module StrongYAML
2
+ class ConfigList
3
+ attr_reader :name, :default
4
+
5
+ def initialize(name, default: nil)
6
+ @name = name
7
+ @default = default
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module StrongYAML
2
+ class ConfigString
3
+ attr_reader :name, :default
4
+
5
+ def initialize(name, default: nil)
6
+ @name = name
7
+ @default = default
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,35 @@
1
+ require_relative "config_group"
2
+ require_relative "config_string"
3
+ require_relative "config_integer"
4
+ require_relative "config_list"
5
+
6
+ module StrongYAML
7
+ class ConfigSchema
8
+ attr_reader :elements
9
+
10
+ class SchemaError < StandardError
11
+ end
12
+
13
+ def initialize
14
+ @elements = []
15
+ end
16
+
17
+ def group(name, &block)
18
+ group = StrongYAML::ConfigGroup.new(name)
19
+ @elements << group
20
+ group.instance_eval(&block)
21
+ end
22
+
23
+ def string(name, **args)
24
+ @elements << StrongYAML::ConfigString.new(name, **args)
25
+ end
26
+
27
+ def integer(name, **args)
28
+ @elements << StrongYAML::ConfigInteger.new(name, **args)
29
+ end
30
+
31
+ def list(name, **args)
32
+ @elements << StrongYAML::ConfigList.new(name, **args)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,116 @@
1
+ require "yaml"
2
+ require "json"
3
+ require "ostruct"
4
+ require "fileutils"
5
+ require_relative "schema/schema"
6
+
7
+ module StrongYAML
8
+ def self.included(base)
9
+ base.extend(ClassMethods)
10
+ end
11
+
12
+ module ClassMethods
13
+ def file(config_location)
14
+ @config_location = config_location
15
+ end
16
+
17
+ def schema(&block)
18
+ @schema = StrongYAML::ConfigSchema.new
19
+ @schema.instance_eval(&block)
20
+ end
21
+
22
+ def load
23
+ @config = YAML.load_file(@config_location)
24
+
25
+ if @schema
26
+ @schema.elements.each do |schema_entry|
27
+ obj = build_schema_entry schema_entry, @config, []
28
+
29
+ define_singleton_method(schema_entry.name) do
30
+ obj
31
+ end
32
+ end
33
+ else
34
+ @config.each do |key, value|
35
+ define_singleton_method(key) do
36
+ if value.is_a? Hash
37
+ JSON.parse value.to_json, object_class: OpenStruct
38
+ else
39
+ value
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ def create_or_load
47
+ if File.exist? @config_location
48
+ load
49
+ elsif @schema
50
+ File.write(@config_location, hash_from_schema.to_yaml)
51
+
52
+ load
53
+ else
54
+ FileUtils.touch(@config_location)
55
+ end
56
+ end
57
+
58
+ private
59
+
60
+ def build_schema_entry(schema_entry, config, path)
61
+ if schema_entry.is_a? StrongYAML::ConfigGroup
62
+ obj = OpenStruct.new
63
+ schema_entry.elements.each do |se|
64
+ obj[se.name] = build_schema_entry(se, config, path + [schema_entry.name])
65
+ end
66
+ obj
67
+ else
68
+ path << schema_entry.name
69
+ value = config.dig(*path.map(&:to_s))
70
+
71
+ case schema_entry
72
+ when StrongYAML::ConfigString
73
+ if value.nil? || value.is_a?(String)
74
+ value
75
+ else
76
+ raise StrongYAML::ConfigSchema::SchemaError, "#{path.map(&:to_s).join(".")} is of type #{value.class}, but should be String"
77
+ end
78
+ when StrongYAML::ConfigInteger
79
+ if value.nil? || value.is_a?(Integer)
80
+ value
81
+ else
82
+ raise StrongYAML::ConfigSchema::SchemaError, "#{path.map(&:to_s).join(".")} is of type #{value.class}, but should be Integer"
83
+ end
84
+ when StrongYAML::ConfigList
85
+ if value.nil? || value.is_a?(Array)
86
+ value
87
+ else
88
+ raise StrongYAML::ConfigSchema::SchemaError, "#{path.map(&:to_s).join(".")} is of type #{value.class}, but should be Array"
89
+ end
90
+ end
91
+ end
92
+ end
93
+
94
+ def hash_from_schema
95
+ hash = {}
96
+
97
+ @schema.elements.each do |schema_entry|
98
+ hash[schema_entry.name.to_s] = value_from_schema_entry(schema_entry)
99
+ end
100
+
101
+ hash
102
+ end
103
+
104
+ def value_from_schema_entry(schema_entry)
105
+ if schema_entry.is_a? StrongYAML::ConfigGroup
106
+ hash = {}
107
+ schema_entry.elements.each do |se|
108
+ hash[se.name.to_s] = value_from_schema_entry(se)
109
+ end
110
+ hash
111
+ else
112
+ schema_entry.default
113
+ end
114
+ end
115
+ end
116
+ end
metadata ADDED
@@ -0,0 +1,52 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: strong_yaml
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Philipp Schlesinger
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-11-15 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Allows for easy YAML parsing and type checking, as well as generators
14
+ email:
15
+ - info@philcomm.dev
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/schema/config_group.rb
21
+ - lib/schema/config_integer.rb
22
+ - lib/schema/config_list.rb
23
+ - lib/schema/config_string.rb
24
+ - lib/schema/schema.rb
25
+ - lib/strong_yaml.rb
26
+ homepage: http://rubygems.org/gems/strong_yaml
27
+ licenses:
28
+ - MIT
29
+ metadata:
30
+ documentation_uri: https://github.com/OfficialPhilcomm/strong_yaml
31
+ source_code_uri: https://github.com/OfficialPhilcomm/strong_yaml
32
+ changelog_uri: https://github.com/OfficialPhilcomm/strong_yaml/blob/master/changelog.md
33
+ post_install_message:
34
+ rdoc_options: []
35
+ require_paths:
36
+ - lib
37
+ required_ruby_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: 3.1.0
42
+ required_rubygems_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ requirements: []
48
+ rubygems_version: 3.3.7
49
+ signing_key:
50
+ specification_version: 4
51
+ summary: Easy YAML type checking
52
+ test_files: []