evt-schema 0.6.0.2
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 +7 -0
- data/lib/schema/controls/data_structure.rb +53 -0
- data/lib/schema/controls/schema.rb +126 -0
- data/lib/schema/controls.rb +2 -0
- data/lib/schema/data_structure.rb +36 -0
- data/lib/schema/schema/assertions.rb +26 -0
- data/lib/schema/schema/attribute.rb +16 -0
- data/lib/schema/schema.rb +138 -0
- data/lib/schema/validation/error.rb +6 -0
- data/lib/schema/validation/nil_attributes.rb +21 -0
- data/lib/schema.rb +11 -0
- metadata +123 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c467a08693a41abecf0d00cece99cee5432a5c95
|
4
|
+
data.tar.gz: f8a24c5de56aa58868ccd13ee6719e089e9b7ce1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1ed970585e37072610ba4a6d2dc17362faeb3d867344c025bdbe06eb7adf96f26a0b90860355c51504926c52f08c7e8f010f7b50e9bf1dbf8f68ada62153a8d9
|
7
|
+
data.tar.gz: 65811f0afcd628e9fcb44e189fc86ad6cf0e24c8f2a4245c0d05049cb10604624a285cdbf30bae66bcacb5c76108c1bea6a211df86981779b6a52c14aa1eeeaa
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Schema
|
2
|
+
module Controls
|
3
|
+
module DataStructure
|
4
|
+
def self.example
|
5
|
+
example = Example.new
|
6
|
+
example.some_attribute = 'some value'
|
7
|
+
example
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.ancestors
|
11
|
+
example.class.ancestors
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.attributes
|
15
|
+
example.attributes
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.hash
|
19
|
+
example.to_h
|
20
|
+
end
|
21
|
+
|
22
|
+
class Example
|
23
|
+
include ::Schema::DataStructure
|
24
|
+
attribute :some_attribute
|
25
|
+
end
|
26
|
+
|
27
|
+
module ExtraAttributes
|
28
|
+
def self.data
|
29
|
+
{
|
30
|
+
:some_attribute => 'some value',
|
31
|
+
:some_other_attribute => 'some other value'
|
32
|
+
}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module ConfigureDependencies
|
37
|
+
def self.example
|
38
|
+
Example.build
|
39
|
+
end
|
40
|
+
|
41
|
+
class Example
|
42
|
+
include ::Schema::DataStructure
|
43
|
+
|
44
|
+
attr_accessor :some_dependency
|
45
|
+
|
46
|
+
def configure
|
47
|
+
self.some_dependency = :set
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
module Schema
|
2
|
+
module Controls
|
3
|
+
module Schema
|
4
|
+
def self.example
|
5
|
+
example = Example.new
|
6
|
+
example.some_attribute = 'some value'
|
7
|
+
example.some_other_attribute = 'some other value'
|
8
|
+
example
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.other_example
|
12
|
+
example = OtherExample.new
|
13
|
+
example.some_attribute = 'some value'
|
14
|
+
example.some_other_attribute = 'some other value'
|
15
|
+
example
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.ancestors
|
19
|
+
example.class.ancestors
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.attributes
|
23
|
+
example.attributes
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.hash
|
27
|
+
example.to_h
|
28
|
+
end
|
29
|
+
|
30
|
+
class Example
|
31
|
+
include ::Schema
|
32
|
+
attribute :some_attribute
|
33
|
+
attribute :some_other_attribute
|
34
|
+
end
|
35
|
+
|
36
|
+
class OtherExample < Example
|
37
|
+
end
|
38
|
+
|
39
|
+
module Equivalent
|
40
|
+
def self.example
|
41
|
+
example = Example.new
|
42
|
+
example.some_attribute = 'some value'
|
43
|
+
example.yet_another_attribute = 'some other value'
|
44
|
+
example
|
45
|
+
end
|
46
|
+
|
47
|
+
class Example
|
48
|
+
include ::Schema
|
49
|
+
attribute :some_attribute
|
50
|
+
attribute :yet_another_attribute
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
module DefaultValue
|
55
|
+
class Example
|
56
|
+
include ::Schema
|
57
|
+
attribute :some_attribute, default: 'some default value'
|
58
|
+
end
|
59
|
+
|
60
|
+
module Proc
|
61
|
+
class Example
|
62
|
+
include ::Schema
|
63
|
+
attribute :some_attribute, default: proc { 'some default value' }
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
module Typed
|
69
|
+
class SomeType
|
70
|
+
end
|
71
|
+
|
72
|
+
class SomeSubtype < SomeType
|
73
|
+
end
|
74
|
+
|
75
|
+
class Example
|
76
|
+
include ::Schema
|
77
|
+
attribute :some_attribute, SomeType
|
78
|
+
end
|
79
|
+
|
80
|
+
module Strict
|
81
|
+
class Example
|
82
|
+
include ::Schema
|
83
|
+
attribute :some_attribute, SomeType, strict: true
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
module Duplicate
|
89
|
+
def self.example
|
90
|
+
Example.new
|
91
|
+
end
|
92
|
+
|
93
|
+
class Example
|
94
|
+
include ::Schema
|
95
|
+
|
96
|
+
attribute :some_attribute, Numeric
|
97
|
+
attribute :some_attribute, String
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
module Validation
|
102
|
+
def self.example
|
103
|
+
Example.new
|
104
|
+
end
|
105
|
+
|
106
|
+
def self.errors
|
107
|
+
[
|
108
|
+
"some_attribute can't be nil",
|
109
|
+
"some_other_attribute can't be nil"
|
110
|
+
]
|
111
|
+
end
|
112
|
+
|
113
|
+
class Example
|
114
|
+
include ::Schema
|
115
|
+
|
116
|
+
attribute :some_attribute
|
117
|
+
attribute :some_other_attribute
|
118
|
+
|
119
|
+
module Validator
|
120
|
+
extend ::Schema::Validation::NilAttributes
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Schema
|
2
|
+
module DataStructure
|
3
|
+
def self.included(cls)
|
4
|
+
cls.class_exec do
|
5
|
+
include Schema
|
6
|
+
extend Build
|
7
|
+
extend Virtual::Macro
|
8
|
+
|
9
|
+
virtual :configure
|
10
|
+
virtual :configure_dependencies do
|
11
|
+
configure
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module Build
|
17
|
+
def build(data=nil, strict=nil)
|
18
|
+
data ||= {}
|
19
|
+
strict ||= false
|
20
|
+
|
21
|
+
new.tap do |instance|
|
22
|
+
set_attributes(instance, data, strict)
|
23
|
+
instance.configure_dependencies
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def set_attributes(instance, data, strict)
|
28
|
+
begin
|
29
|
+
SetAttributes.(instance, data, strict: strict)
|
30
|
+
rescue SetAttributes::Attribute::Error => e
|
31
|
+
raise Schema::Error, e.message
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Schema
|
2
|
+
module Assertions
|
3
|
+
def attributes_equal?(other, attributes=nil, print: nil)
|
4
|
+
attributes ||= self.class.attribute_names
|
5
|
+
|
6
|
+
print = true if print.nil?
|
7
|
+
print ||= false
|
8
|
+
|
9
|
+
equal = self.eql?(other, attributes, ignore_class: true)
|
10
|
+
|
11
|
+
if !equal && print
|
12
|
+
attributes = Array(attributes)
|
13
|
+
|
14
|
+
require 'pp'
|
15
|
+
puts "self: #{self.class.name}"
|
16
|
+
pp self.attributes.select { |k, v| attributes.include? k }
|
17
|
+
puts "other #{other.class.name}:"
|
18
|
+
pp other.attributes.select { |k, v| attributes.include? k }
|
19
|
+
puts "attributes:"
|
20
|
+
attributes.each { |a| puts a.inspect}
|
21
|
+
end
|
22
|
+
|
23
|
+
equal
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Schema
|
2
|
+
class Attribute
|
3
|
+
class Error < Schema::Error; end
|
4
|
+
class TypeError < Schema::Attribute::Error; end
|
5
|
+
|
6
|
+
attr_reader :name
|
7
|
+
attr_reader :type
|
8
|
+
attr_reader :strict
|
9
|
+
|
10
|
+
def initialize(name, type, strict)
|
11
|
+
@name = name
|
12
|
+
@type = type
|
13
|
+
@strict = strict
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
module Schema
|
2
|
+
class Error < RuntimeError; end
|
3
|
+
|
4
|
+
def self.included(cls)
|
5
|
+
cls.class_exec do
|
6
|
+
extend AttributeMacro
|
7
|
+
extend AttributeList
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module AttributeMacro
|
12
|
+
def attribute_macro(attr_name, type=nil, strict: nil, default: nil)
|
13
|
+
if type.nil? && !strict.nil?
|
14
|
+
raise Schema::Attribute::Error, "The \"#{attr_name}\" attribute is declared with the \"strict\" option but a type is not specified"
|
15
|
+
end
|
16
|
+
|
17
|
+
strict ||= false
|
18
|
+
check = nil
|
19
|
+
|
20
|
+
unless type.nil?
|
21
|
+
check = proc do |val|
|
22
|
+
unless val.nil?
|
23
|
+
if strict
|
24
|
+
raise Schema::Attribute::TypeError, "#{val.inspect} is not an instance of #{type.name}" unless val.instance_of? type
|
25
|
+
else
|
26
|
+
raise Schema::Attribute::TypeError, "#{val.inspect} is not a kind of #{type.name}" unless val.is_a? type
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
initialize_value = nil
|
33
|
+
if default.is_a? Proc
|
34
|
+
initialize_value = default
|
35
|
+
elsif !default.nil?
|
36
|
+
initialize_value = proc { default }
|
37
|
+
end
|
38
|
+
|
39
|
+
::Attribute::Define.(self, attr_name, :accessor, check: check, &initialize_value)
|
40
|
+
|
41
|
+
attribute = attributes.register(attr_name, type, strict)
|
42
|
+
attribute
|
43
|
+
end
|
44
|
+
alias :attribute :attribute_macro
|
45
|
+
end
|
46
|
+
|
47
|
+
module AttributeList
|
48
|
+
def attributes
|
49
|
+
@attributes ||= AttributeRegistry.new
|
50
|
+
end
|
51
|
+
|
52
|
+
def attribute_names
|
53
|
+
attributes.map { |attribute| attribute.name }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
class AttributeRegistry
|
58
|
+
def entries
|
59
|
+
@entries ||= []
|
60
|
+
end
|
61
|
+
|
62
|
+
def length
|
63
|
+
entries.length
|
64
|
+
end
|
65
|
+
alias :count :length
|
66
|
+
|
67
|
+
def [](index)
|
68
|
+
entries[index]
|
69
|
+
end
|
70
|
+
|
71
|
+
def map(&action)
|
72
|
+
entries.map(&action)
|
73
|
+
end
|
74
|
+
|
75
|
+
def each_with_object(obj, &action)
|
76
|
+
entries.each_with_object(obj, &action)
|
77
|
+
end
|
78
|
+
|
79
|
+
def add(name, type, strict=nil)
|
80
|
+
strict ||= false
|
81
|
+
attribute = Schema::Attribute.new(name, type, strict)
|
82
|
+
entries << attribute
|
83
|
+
attribute
|
84
|
+
end
|
85
|
+
|
86
|
+
def register(name, type, strict=nil)
|
87
|
+
remove(name)
|
88
|
+
add(name, type, strict)
|
89
|
+
end
|
90
|
+
|
91
|
+
def remove(name)
|
92
|
+
entries.delete_if { |entry| entry.name == name }
|
93
|
+
end
|
94
|
+
|
95
|
+
def attribute(name)
|
96
|
+
entries.find { |entry| entry.name == name }
|
97
|
+
end
|
98
|
+
|
99
|
+
def attribute?(name)
|
100
|
+
!attribute(name).nil?
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def attributes
|
105
|
+
self.class.attributes.each_with_object({}) do |attribute, attributes|
|
106
|
+
attributes[attribute.name] = public_send(attribute.name)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
alias :to_h :attributes
|
110
|
+
|
111
|
+
def ==(other, attributes=nil, ignore_class: nil)
|
112
|
+
attributes ||= self.class.attribute_names
|
113
|
+
attributes = Array(attributes)
|
114
|
+
|
115
|
+
ignore_class = false if ignore_class.nil?
|
116
|
+
|
117
|
+
if !ignore_class
|
118
|
+
return false if self.class != other.class
|
119
|
+
end
|
120
|
+
|
121
|
+
attributes.each do |attribute|
|
122
|
+
if attribute.is_a? Hash
|
123
|
+
this_attribute, other_attribute = attribute.keys.first, attribute.values.first
|
124
|
+
else
|
125
|
+
this_attribute, other_attribute = attribute, attribute
|
126
|
+
end
|
127
|
+
|
128
|
+
return false if public_send(this_attribute) != other.public_send(other_attribute)
|
129
|
+
end
|
130
|
+
|
131
|
+
true
|
132
|
+
end
|
133
|
+
alias :eql? :==
|
134
|
+
|
135
|
+
def ===(other)
|
136
|
+
self.eql?(other, ignore_class: true)
|
137
|
+
end
|
138
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Schema
|
2
|
+
module Validation
|
3
|
+
module NilAttributes
|
4
|
+
def nil_attributes
|
5
|
+
Validator
|
6
|
+
end
|
7
|
+
|
8
|
+
module Validator
|
9
|
+
def self.call(schema, errors=nil)
|
10
|
+
errors ||= []
|
11
|
+
schema.class.attribute_names.each do |attribute|
|
12
|
+
if schema.public_send(attribute).nil?
|
13
|
+
errors << "#{attribute} can't be nil"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
errors.empty?
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/schema.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'attribute'
|
2
|
+
require 'set_attributes'
|
3
|
+
require 'validate'
|
4
|
+
require 'virtual'
|
5
|
+
|
6
|
+
require 'schema/schema'
|
7
|
+
require 'schema/schema/assertions'
|
8
|
+
require 'schema/schema/attribute'
|
9
|
+
require 'schema/data_structure'
|
10
|
+
require 'schema/validation/nil_attributes'
|
11
|
+
require 'schema/validation/error'
|
metadata
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: evt-schema
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.6.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- The Eventide Project
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-12-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: evt-attribute
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: evt-set_attributes
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: evt-validate
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: evt-virtual
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: ntl-test_bench
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: " "
|
84
|
+
email: opensource@eventide-project.org
|
85
|
+
executables: []
|
86
|
+
extensions: []
|
87
|
+
extra_rdoc_files: []
|
88
|
+
files:
|
89
|
+
- lib/schema.rb
|
90
|
+
- lib/schema/controls.rb
|
91
|
+
- lib/schema/controls/data_structure.rb
|
92
|
+
- lib/schema/controls/schema.rb
|
93
|
+
- lib/schema/data_structure.rb
|
94
|
+
- lib/schema/schema.rb
|
95
|
+
- lib/schema/schema/assertions.rb
|
96
|
+
- lib/schema/schema/attribute.rb
|
97
|
+
- lib/schema/validation/error.rb
|
98
|
+
- lib/schema/validation/nil_attributes.rb
|
99
|
+
homepage: https://github.com/eventide-project/schema
|
100
|
+
licenses:
|
101
|
+
- MIT
|
102
|
+
metadata: {}
|
103
|
+
post_install_message:
|
104
|
+
rdoc_options: []
|
105
|
+
require_paths:
|
106
|
+
- lib
|
107
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: 2.3.3
|
112
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
requirements: []
|
118
|
+
rubyforge_project:
|
119
|
+
rubygems_version: 2.5.2
|
120
|
+
signing_key:
|
121
|
+
specification_version: 4
|
122
|
+
summary: Primitives for schema and structure
|
123
|
+
test_files: []
|