nobrainer 0.35.0 → 0.36.0
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 61c15de4e6f0d6ede87a2db309ff25a79d36d61befdfcd280815925d0f66bb68
|
4
|
+
data.tar.gz: f1516356fe4f53577a744dfacca6a8143d98844aee540e8c0290950113bedd88
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3fabd4ff40209300d3630cee18bd27115d77f6c157b6d9f910ac93896ef11487f1cf1cb116fb7a98ef356e3c78033412c05ddf06d60ed473b753a26a9aab4ab2
|
7
|
+
data.tar.gz: 9d3299f45f30001d6856ea015b15c19a9f5b7ec5642337c3416da160468deb5f00b5714f54eb3837b0af716c1a61fc817963280830bffa6b09bf15775624590f
|
data/CHANGELOG.md
CHANGED
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
7
7
|
## [Unreleased]
|
8
8
|
|
9
9
|
|
10
|
+
## [0.36.0] - 2021-08-08
|
11
|
+
### Added
|
12
|
+
- Array and TypedArray types for validation and serialization
|
13
|
+
|
10
14
|
## [0.35.0] - 2021-08-08
|
11
15
|
### Added
|
12
16
|
- Dockerfile, docker-compose and Earthfile
|
@@ -100,7 +104,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
100
104
|
- Locks: bug fix: allow small timeouts in lock()
|
101
105
|
- Fix reentrant lock counter on steals
|
102
106
|
|
103
|
-
[Unreleased]: https://github.com/nobrainerorm/nobrainer/compare/v0.
|
107
|
+
[Unreleased]: https://github.com/nobrainerorm/nobrainer/compare/v0.36.0...HEAD
|
108
|
+
[0.36.0]: https://github.com/nobrainerorm/nobrainer/compare/v0.35.0...v0.36.0
|
104
109
|
[0.35.0]: https://github.com/nobrainerorm/nobrainer/compare/v0.34.1...v0.35.0
|
105
110
|
[0.34.1]: https://github.com/nobrainerorm/nobrainer/compare/v0.34.0...v0.34.1
|
106
111
|
[0.34.0]: https://github.com/nobrainerorm/nobrainer/compare/v0.33.0...v0.34.0
|
@@ -33,8 +33,12 @@ module NoBrainer::Document::Association::EagerLoader
|
|
33
33
|
def eager_load_association(docs, association_name, criteria=nil)
|
34
34
|
docs = docs.compact
|
35
35
|
return [] if docs.empty?
|
36
|
-
|
37
|
-
|
36
|
+
|
37
|
+
meta = docs.first.class.association_metadata
|
38
|
+
root_meta = docs.first.root_class.association_metadata
|
39
|
+
association = meta[association_name.to_sym] || root_meta[association_name.to_sym] ||
|
40
|
+
meta[association_name.to_s.singularize.to_sym] || root_meta[association_name.to_s.singularize.to_sym]
|
41
|
+
|
38
42
|
raise "Unknown association #{association_name}" unless association
|
39
43
|
association.eager_load(docs, criteria)
|
40
44
|
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'active_support/core_ext/array/wrap'
|
2
|
+
|
3
|
+
module NoBrainer
|
4
|
+
class Array < ::Array
|
5
|
+
# delegate cast to each array element
|
6
|
+
def self.nobrainer_cast_user_to_model(values)
|
7
|
+
::Array.wrap(values).map do |value|
|
8
|
+
if value.class.respond_to?(:nobrainer_cast_user_to_model)
|
9
|
+
value.class.nobrainer_cast_user_to_model(value)
|
10
|
+
else
|
11
|
+
value
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# delegate cast to each array element
|
17
|
+
def self.nobrainer_cast_model_to_db(values)
|
18
|
+
::Array.wrap(values).map do |value|
|
19
|
+
if value.class.respond_to?(:nobrainer_cast_model_to_db)
|
20
|
+
value.class.nobrainer_cast_model_to_db(value)
|
21
|
+
else
|
22
|
+
value
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# delegate cast to each array element
|
28
|
+
def self.nobrainer_cast_db_to_model(values)
|
29
|
+
::Array.wrap(values).map do |value|
|
30
|
+
if value.class.respond_to?(:nobrainer_cast_db_to_model)
|
31
|
+
value.class.nobrainer_cast_db_to_model(method, value)
|
32
|
+
else
|
33
|
+
value
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# convenience method to create a TypedArray
|
39
|
+
def self.of(object_type = nil, **options)
|
40
|
+
NoBrainer::TypedArray.of(object_type, **options)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class TypedArray < Array
|
45
|
+
def self.of(object_type, allow_nil: false)
|
46
|
+
NoBrainer::Document::Types.load_type_extensions(object_type)
|
47
|
+
::Class.new(TypedArray) do
|
48
|
+
define_singleton_method(:object_type) { object_type }
|
49
|
+
define_singleton_method(:allow_nil?) { allow_nil }
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.name
|
54
|
+
str = String.new "Array"
|
55
|
+
str += "(#{object_type.name})" if respond_to?(:object_type)
|
56
|
+
str
|
57
|
+
end
|
58
|
+
|
59
|
+
# delegate cast methods to object_type cast methods, if defined
|
60
|
+
def self.nobrainer_cast_user_to_model(values)
|
61
|
+
cast_type = object_type.respond_to?(:nobrainer_cast_user_to_model) && object_type
|
62
|
+
values = ::Array.wrap(values).map do |value|
|
63
|
+
value = cast_type.nobrainer_cast_user_to_model(value) if cast_type
|
64
|
+
unless (value.nil? && allow_nil?) || value.is_a?(object_type)
|
65
|
+
raise NoBrainer::Error::InvalidType, type: object_type.name, value: value
|
66
|
+
end
|
67
|
+
value
|
68
|
+
end
|
69
|
+
new(values)
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.nobrainer_cast_model_to_db(values)
|
73
|
+
values = ::Array.wrap(values)
|
74
|
+
if object_type.respond_to?(:nobrainer_cast_model_to_db)
|
75
|
+
values.map { |value| object_type.nobrainer_cast_model_to_db(value) }
|
76
|
+
else
|
77
|
+
values
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.nobrainer_cast_db_to_model(values)
|
82
|
+
values = ::Array.wrap(values)
|
83
|
+
if object_type.respond_to?(:nobrainer_cast_db_to_model)
|
84
|
+
values.map { |value| object_type.nobrainer_cast_db_to_model(value) }
|
85
|
+
else
|
86
|
+
values
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -62,6 +62,11 @@ module NoBrainer::Document::Types
|
|
62
62
|
end
|
63
63
|
|
64
64
|
def field(attr, options={})
|
65
|
+
if (type = options[:type]).is_a?(::Array)
|
66
|
+
raise ArgumentError, "Expected Array type to have single element, got #{types.inspect}" unless type.length == 1
|
67
|
+
options[:type] = NoBrainer::TypedArray.of(type.first)
|
68
|
+
end
|
69
|
+
|
65
70
|
super
|
66
71
|
|
67
72
|
type = options[:type]
|
@@ -108,7 +113,7 @@ module NoBrainer::Document::Types
|
|
108
113
|
end
|
109
114
|
end
|
110
115
|
|
111
|
-
%w(binary boolean text geo enum).each do |type|
|
116
|
+
%w(array binary boolean text geo enum).each do |type|
|
112
117
|
require File.join(File.dirname(__FILE__), 'types', type)
|
113
118
|
const_set(type.camelize, NoBrainer.const_get(type.camelize))
|
114
119
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nobrainer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.36.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nicolas Viennot
|
@@ -154,6 +154,7 @@ files:
|
|
154
154
|
- lib/no_brainer/document/table_config/synchronizer.rb
|
155
155
|
- lib/no_brainer/document/timestamps.rb
|
156
156
|
- lib/no_brainer/document/types.rb
|
157
|
+
- lib/no_brainer/document/types/array.rb
|
157
158
|
- lib/no_brainer/document/types/binary.rb
|
158
159
|
- lib/no_brainer/document/types/boolean.rb
|
159
160
|
- lib/no_brainer/document/types/date.rb
|