fried-schema 2.0.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/fried/schema/compare.rb +78 -0
- data/lib/fried/schema/create_definition_if_missing.rb +29 -0
- data/lib/fried/schema/data_entity.rb +5 -4
- data/lib/fried/schema/get_definition.rb +21 -0
- data/lib/fried/schema/struct.rb +18 -6
- data/lib/fried/schema/version.rb +1 -1
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 46020d2292e48229329d1db62423cb1e84b2914d
|
4
|
+
data.tar.gz: d7f87baa4d01f27aaf4178a7d7de13ce9f067f60
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 21026e6c724c72c2093a5865997764effddb846b84c73a159c9c3e9eeb6b71c17be19674ed39dd3673e4673347a38bb843fbe326f9944315ee86f9be221d2f3f
|
7
|
+
data.tar.gz: 4c7a64f85cfe8ddfce9b182dad4735e70cfcb407f1e53f85edbec7ab08992355f0bf39cba1431a654f30858e628b0e291f8caed9620cbbb94dffddfcf6e8bcf5
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require "fried/core"
|
2
|
+
require "fried/typings"
|
3
|
+
require "fried/schema/definition"
|
4
|
+
require "fried/schema/get_attribute"
|
5
|
+
require "fried/schema/struct"
|
6
|
+
|
7
|
+
module Fried::Schema
|
8
|
+
# Compares two {Struct} objects, used for sorting and equality
|
9
|
+
class Compare
|
10
|
+
include ::Fried::Typings
|
11
|
+
|
12
|
+
attr_accessor :get_attribute
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
self.get_attribute = GetAttribute.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.build
|
19
|
+
new.tap do |instance|
|
20
|
+
instance.get_attribute = GetAttribute.build
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.call(schema, struct, other)
|
25
|
+
instance = build
|
26
|
+
instance.(schema, struct, other)
|
27
|
+
end
|
28
|
+
|
29
|
+
# @param schema [Definition]
|
30
|
+
# @param struct [Struct]
|
31
|
+
# @param other [Struct]
|
32
|
+
# @return [Integer, nil] like `<=>` sign
|
33
|
+
def call(schema, struct, other)
|
34
|
+
return nil unless struct.class == other.class
|
35
|
+
return nil unless Is[Struct].valid?(struct)
|
36
|
+
return nil unless Is[Struct].valid?(other)
|
37
|
+
|
38
|
+
compare(schema, struct, other)
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def compare(schema, struct, other)
|
44
|
+
comparison = 0
|
45
|
+
|
46
|
+
each_values(schema, struct, other) do |struct_value, other_value|
|
47
|
+
next unless struct_value.respond_to?(:"<=>")
|
48
|
+
next unless other_value.respond_to?(:"<=>")
|
49
|
+
comparison = struct_value <=> other_value
|
50
|
+
break if comparison != 0
|
51
|
+
end
|
52
|
+
|
53
|
+
comparison
|
54
|
+
end
|
55
|
+
|
56
|
+
def same_schema?(schema, struct, other)
|
57
|
+
schema.
|
58
|
+
each_attribute.
|
59
|
+
all? do |attr|
|
60
|
+
struct.respond_to?(attr.reader) && other.respond_to?(attr.reader)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def each_values(schema, struct, other, &block)
|
65
|
+
schema.
|
66
|
+
each_attribute.
|
67
|
+
lazy.
|
68
|
+
map { |attr| attr_values_pair(attr, struct, other) }.
|
69
|
+
each do |struct_value, other_value|
|
70
|
+
block.call(struct_value, other_value)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def attr_values_pair(attr, struct, other)
|
75
|
+
[get_attribute.(struct, attr), get_attribute.(other, attr)]
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require "fried/core"
|
2
|
+
require "fried/schema/get_definition"
|
3
|
+
require "fried/schema/definition"
|
4
|
+
|
5
|
+
module Fried::Schema
|
6
|
+
# Creates schema definition if missing
|
7
|
+
class CreateDefinitionIfMissing
|
8
|
+
attr_accessor :get_definition
|
9
|
+
|
10
|
+
def self.build
|
11
|
+
new.tap do |instance|
|
12
|
+
instance.get_definition = GetDefinition.build
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.call(obj)
|
17
|
+
instance = build
|
18
|
+
instance.(obj)
|
19
|
+
end
|
20
|
+
|
21
|
+
# @param obj [Class] a {Struct} or {DataEntity} class
|
22
|
+
# @return [Definition]
|
23
|
+
def call(obj)
|
24
|
+
schema = get_definition.(obj)
|
25
|
+
|
26
|
+
schema || obj.instance_variable_set(:@__fried_schema__, Definition.new)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require "fried/core"
|
2
|
+
require "fried/schema/get_definition"
|
2
3
|
require "fried/schema/struct"
|
3
4
|
require "fried/schema/attributes_to_hash"
|
4
5
|
require "fried/schema/hash_to_attributes"
|
@@ -10,8 +11,8 @@ module Fried::Schema
|
|
10
11
|
module ClassMethods
|
11
12
|
def build(attributes = {})
|
12
13
|
new.tap do |instance|
|
13
|
-
schema =
|
14
|
-
|
14
|
+
schema = GetDefinition.(self)
|
15
|
+
HashToAttributes.(schema, attributes, instance)
|
15
16
|
end
|
16
17
|
end
|
17
18
|
end
|
@@ -19,8 +20,8 @@ module Fried::Schema
|
|
19
20
|
# @return [Hash{Symbol => Object}] a hash containing the values of all
|
20
21
|
# attribute name => value
|
21
22
|
def to_h
|
22
|
-
schema = self.class
|
23
|
-
|
23
|
+
schema = GetDefinition.(self.class)
|
24
|
+
AttributesToHash.(schema, self)
|
24
25
|
end
|
25
26
|
|
26
27
|
def self.included(klass)
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "fried/core"
|
2
|
+
|
3
|
+
module Fried::Schema
|
4
|
+
# Get schema definition from {Struct}
|
5
|
+
class GetDefinition
|
6
|
+
def self.build
|
7
|
+
new
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.call(obj)
|
11
|
+
instance = build
|
12
|
+
instance.(obj)
|
13
|
+
end
|
14
|
+
|
15
|
+
# @param obj [Class] a {Struct} or {DataEntity} class
|
16
|
+
# @return [Definition]
|
17
|
+
def call(obj)
|
18
|
+
obj.instance_variable_get(:@__fried_schema__)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/fried/schema/struct.rb
CHANGED
@@ -2,7 +2,10 @@ require "fried/core"
|
|
2
2
|
require "fried/typings"
|
3
3
|
require "fried/schema/attribute/definition"
|
4
4
|
require "fried/schema/attribute/define_methods"
|
5
|
+
require "fried/schema/compare"
|
6
|
+
require "fried/schema/create_definition_if_missing"
|
5
7
|
require "fried/schema/definition"
|
8
|
+
require "fried/schema/get_definition"
|
6
9
|
require "fried/schema/set_defaults"
|
7
10
|
|
8
11
|
module Fried::Schema
|
@@ -12,8 +15,8 @@ module Fried::Schema
|
|
12
15
|
module Struct
|
13
16
|
module Initializer
|
14
17
|
def initialize
|
15
|
-
schema = self.class
|
16
|
-
|
18
|
+
schema = GetDefinition.(self.class)
|
19
|
+
SetDefaults.(schema, self)
|
17
20
|
end
|
18
21
|
end
|
19
22
|
|
@@ -30,20 +33,29 @@ module Fried::Schema
|
|
30
33
|
# object initialization
|
31
34
|
# @return [Symbol] reader method name
|
32
35
|
def attribute(name, type, default: Noop)
|
33
|
-
|
34
|
-
definer =
|
36
|
+
schema = CreateDefinitionIfMissing.(self)
|
37
|
+
definer = Attribute::Definition
|
35
38
|
attribute_definition = definer.new(name, type, default)
|
36
|
-
|
37
|
-
|
39
|
+
schema.add_attribute(attribute_definition)
|
40
|
+
Attribute::DefineMethods.(attribute_definition, self)
|
38
41
|
end
|
39
42
|
end
|
40
43
|
|
41
44
|
def self.included(klass)
|
45
|
+
CreateDefinitionIfMissing.(klass)
|
46
|
+
|
42
47
|
klass.instance_eval do
|
43
48
|
include Initializer
|
44
49
|
extend ClassMethods
|
45
50
|
include ::Fried::Typings
|
51
|
+
include Comparable
|
46
52
|
end
|
47
53
|
end
|
54
|
+
|
55
|
+
def <=>(other)
|
56
|
+
schema = GetDefinition.(self.class)
|
57
|
+
|
58
|
+
Compare.(schema, self, other)
|
59
|
+
end
|
48
60
|
end
|
49
61
|
end
|
data/lib/fried/schema/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fried-schema
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fire-Dragon-DoL
|
@@ -160,9 +160,12 @@ files:
|
|
160
160
|
- lib/fried/schema/attribute/define_writer.rb
|
161
161
|
- lib/fried/schema/attribute/definition.rb
|
162
162
|
- lib/fried/schema/attributes_to_hash.rb
|
163
|
+
- lib/fried/schema/compare.rb
|
164
|
+
- lib/fried/schema/create_definition_if_missing.rb
|
163
165
|
- lib/fried/schema/data_entity.rb
|
164
166
|
- lib/fried/schema/definition.rb
|
165
167
|
- lib/fried/schema/get_attribute.rb
|
168
|
+
- lib/fried/schema/get_definition.rb
|
166
169
|
- lib/fried/schema/hash_to_attributes.rb
|
167
170
|
- lib/fried/schema/set_attribute.rb
|
168
171
|
- lib/fried/schema/set_attribute_without_checks.rb
|