sequent 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/sequent/core/command.rb +1 -0
- data/lib/sequent/core/command_service.rb +4 -8
- data/lib/sequent/core/ext/ext.rb +54 -0
- data/lib/sequent/core/helpers/array_with_type.rb +22 -0
- data/lib/sequent/core/helpers/association_validator.rb +20 -2
- data/lib/sequent/core/helpers/attribute_support.rb +22 -94
- data/lib/sequent/core/helpers/date_time_validator.rb +20 -0
- data/lib/sequent/core/helpers/date_validator.rb +18 -0
- data/lib/sequent/core/helpers/default_validators.rb +26 -0
- data/lib/sequent/core/helpers/helpers.rb +5 -1
- data/lib/sequent/core/helpers/param_support.rb +4 -4
- data/lib/sequent/core/helpers/string_to_value_parsers.rb +73 -0
- data/lib/sequent/core/helpers/type_conversion_support.rb +28 -0
- data/lib/sequent/core/helpers/value_validators.rb +53 -0
- data/lib/sequent/core/value_object.rb +1 -0
- data/lib/version.rb +1 -1
- metadata +10 -2
- data/lib/sequent/core/helpers/boolean_support.rb +0 -36
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a1582cc8d34049b1e10ed9c90391e3e7167c1ff
|
4
|
+
data.tar.gz: 5960fdac4834a4bb4f96b1643e6885da90f79587
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f8ac133e7cbf158f48fe175527b4093c961b3637ea4a5b04d8373caeb2915dbc0ffede971c4f2a6a5d34bbc470e8cd3d9991ebaac784afd73ec610212f94be6
|
7
|
+
data.tar.gz: 1fdbf2610073c2731dfda81416a39c6d40eed6cdf4eed05ab0ac5c5813078d68c82a8a28bd8338c0ed06ef98ef0f2bc9f098c185ce6af4967e6f9ce9a900b6e1
|
data/lib/sequent/core/command.rb
CHANGED
@@ -71,14 +71,10 @@ module Sequent
|
|
71
71
|
commands.each do |command|
|
72
72
|
@filters.each { |filter| filter.execute(command) }
|
73
73
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
end
|
79
|
-
|
80
|
-
@repository.commit(command)
|
81
|
-
raise CommandNotValid.new(command) unless command.validation_errors.empty?
|
74
|
+
raise CommandNotValid.new(command) unless command.valid?
|
75
|
+
parsed_command = command.parse_attrs_to_correct_types
|
76
|
+
@command_handlers.select { |h| h.handles_message?(parsed_command) }.each { |h| h.handle_message parsed_command }
|
77
|
+
@repository.commit(parsed_command)
|
82
78
|
end
|
83
79
|
end
|
84
80
|
ensure
|
@@ -0,0 +1,54 @@
|
|
1
|
+
class Symbol
|
2
|
+
|
3
|
+
def self.deserialize_from_json(value)
|
4
|
+
value.blank? ? nil : value.try(:to_sym)
|
5
|
+
end
|
6
|
+
|
7
|
+
end
|
8
|
+
|
9
|
+
class String
|
10
|
+
|
11
|
+
def self.deserialize_from_json(value)
|
12
|
+
value
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
class Integer
|
18
|
+
|
19
|
+
def self.deserialize_from_json(value)
|
20
|
+
value.blank? ? nil : value.to_i
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
class Boolean
|
26
|
+
|
27
|
+
def self.deserialize_from_json(value)
|
28
|
+
value.nil? ? nil : (value.present? ? value : false)
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
class Date
|
34
|
+
|
35
|
+
def self.deserialize_from_json(value)
|
36
|
+
value.blank? ? nil : Date.iso8601(value.dup)
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
class DateTime
|
42
|
+
|
43
|
+
def self.deserialize_from_json(value)
|
44
|
+
value.blank? ? nil : DateTime.iso8601(value.dup)
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
class Array
|
50
|
+
|
51
|
+
def self.deserialize_from_json(value)
|
52
|
+
value
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Sequent
|
2
|
+
module Core
|
3
|
+
module Helpers
|
4
|
+
class ArrayWithType
|
5
|
+
attr_accessor :item_type
|
6
|
+
|
7
|
+
def initialize(item_type)
|
8
|
+
raise "needs a item_type" unless item_type
|
9
|
+
@item_type = item_type
|
10
|
+
end
|
11
|
+
|
12
|
+
def deserialize_from_json(value)
|
13
|
+
value.nil? ? nil : value.map { |item| item_type.deserialize_from_json(item) }
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
"Sequent::Core::Helpers::ArrayWithType.new(#{item_type})"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -23,13 +23,31 @@ module Sequent
|
|
23
23
|
associations.each do |association|
|
24
24
|
next unless association # since ruby 2.0...?
|
25
25
|
value = record.instance_variable_get("@#{association.to_s}")
|
26
|
-
if value &&
|
26
|
+
if value && incorrect_type?(value, record, association)
|
27
27
|
record.errors[association] = "is not of type #{record.attributes[association]}"
|
28
28
|
elsif value && value.kind_of?(Array)
|
29
|
-
|
29
|
+
item_type = record.class.type_for(association).item_type
|
30
|
+
record.errors[association] = "is invalid" if all_valid?(value, item_type)
|
30
31
|
else
|
31
32
|
record.errors[association] = "is invalid" if value && value.invalid?
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
32
38
|
|
39
|
+
def incorrect_type?(value, record, association)
|
40
|
+
!value.kind_of?(Array) && record.respond_to?(:attributes) && !value.kind_of?(record.attributes[association])
|
41
|
+
end
|
42
|
+
|
43
|
+
def all_valid?(value, item_type)
|
44
|
+
value.any? do |v|
|
45
|
+
if v.nil?
|
46
|
+
true
|
47
|
+
elsif v.respond_to? :valid?
|
48
|
+
not v.valid?
|
49
|
+
else
|
50
|
+
not Sequent::Core::Helpers::ValueValidators.for(item_type).valid_value?(v)
|
33
51
|
end
|
34
52
|
end
|
35
53
|
end
|
@@ -1,47 +1,7 @@
|
|
1
1
|
require 'active_support'
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
def self.deserialize_from_json(value)
|
6
|
-
value.try(:to_sym)
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
class String
|
11
|
-
def self.deserialize_from_json(value)
|
12
|
-
value
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
class Integer
|
17
|
-
def self.deserialize_from_json(value)
|
18
|
-
value.blank? ? nil : value.to_i
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
class Boolean
|
23
|
-
def self.deserialize_from_json(value)
|
24
|
-
value.nil? ? nil : (value.present? ? value : false)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
class Date
|
29
|
-
def self.deserialize_from_json(value)
|
30
|
-
value.nil? ? nil : Date.iso8601(value.dup)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
class DateTime
|
35
|
-
def self.deserialize_from_json(value)
|
36
|
-
value.nil? ? nil : DateTime.iso8601(value.dup)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
class Array
|
41
|
-
def self.deserialize_from_json(value)
|
42
|
-
value
|
43
|
-
end
|
44
|
-
end
|
2
|
+
require_relative '../ext/ext'
|
3
|
+
require_relative 'array_with_type'
|
4
|
+
require_relative 'default_validators'
|
45
5
|
|
46
6
|
module Sequent
|
47
7
|
module Core
|
@@ -73,13 +33,30 @@ module Sequent
|
|
73
33
|
end
|
74
34
|
end
|
75
35
|
|
36
|
+
def type_for(name)
|
37
|
+
@types.find { |k, _| k == name }.last
|
38
|
+
end
|
39
|
+
|
76
40
|
def attrs(args)
|
77
41
|
@types ||= {}
|
78
42
|
@types.merge!(args)
|
79
|
-
|
43
|
+
associations = []
|
44
|
+
args.each do |attribute, type|
|
80
45
|
attr_accessor attribute
|
81
|
-
|
46
|
+
if included_modules.include?(Sequent::Core::Helpers::TypeConversionSupport)
|
47
|
+
Sequent::Core::Helpers::DefaultValidators.for(type).add_validations_for(self, attribute)
|
48
|
+
end
|
82
49
|
|
50
|
+
if type.class == Sequent::Core::Helpers::ArrayWithType
|
51
|
+
associations << attribute
|
52
|
+
elsif included_modules.include?(ActiveModel::Validations) &&
|
53
|
+
type.included_modules.include?(Sequent::Core::Helpers::AttributeSupport)
|
54
|
+
associations << attribute
|
55
|
+
end
|
56
|
+
end
|
57
|
+
if included_modules.include?(ActiveModel::Validations) && associations.present?
|
58
|
+
validates_with Sequent::Core::Helpers::AssociationValidator, associations: associations
|
59
|
+
end
|
83
60
|
# Generate method that sets all defined attributes based on the attrs hash.
|
84
61
|
class_eval <<EOS
|
85
62
|
def update_all_attributes(attrs)
|
@@ -148,57 +125,8 @@ EOS
|
|
148
125
|
prefix ? HashWithIndifferentAccess[result.map { |k, v| ["#{prefix}_#{k}", v] }] : result
|
149
126
|
end
|
150
127
|
|
151
|
-
# If you have a Date object validate it with this method when the unparsed input is a String
|
152
|
-
# This scenario is typically when a date is posted from the web.
|
153
|
-
#
|
154
|
-
# Example
|
155
|
-
#
|
156
|
-
# class Person < Sequent::Core::ValueObject
|
157
|
-
# attrs date_of_birth: Date
|
158
|
-
#
|
159
|
-
# validate :valid_date
|
160
|
-
# end
|
161
|
-
#
|
162
|
-
# If the date_of_birth is a valid date it will be parsed into a proper Date object.
|
163
|
-
# This implementation currently only support dd-mm-yyyy format.
|
164
|
-
def valid_date
|
165
|
-
self.class.types.each do |name, clazz|
|
166
|
-
if clazz == Date
|
167
|
-
return if self.instance_variable_get("@#{name}").kind_of? Date
|
168
|
-
unless self.instance_variable_get("@#{name}").blank?
|
169
|
-
if (/\d{2}-\d{2}-\d{4}/ =~ self.instance_variable_get("@#{name}")).nil?
|
170
|
-
@errors.add(name.to_s, :invalid_date) if (/\d{2}-\d{2}-\d{4}/ =~ self.instance_variable_get("@#{name}")).nil?
|
171
|
-
else
|
172
|
-
begin
|
173
|
-
self.instance_variable_set "@#{name}", Date.strptime(self.instance_variable_get("@#{name}"), "%d-%m-%Y")
|
174
|
-
rescue
|
175
|
-
@errors.add(name.to_s, :invalid_date)
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
end
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
128
|
end
|
185
129
|
|
186
|
-
class ArrayWithType
|
187
|
-
attr_accessor :item_type
|
188
|
-
|
189
|
-
def initialize(item_type)
|
190
|
-
raise "needs a item_type" unless item_type
|
191
|
-
@item_type = item_type
|
192
|
-
end
|
193
|
-
|
194
|
-
def deserialize_from_json(value)
|
195
|
-
value.nil? ? nil : value.map { |item| item_type.deserialize_from_json(item) }
|
196
|
-
end
|
197
|
-
|
198
|
-
def to_s
|
199
|
-
"Sequent::Core::Helpers::ArrayWithType.new(#{item_type})"
|
200
|
-
end
|
201
|
-
end
|
202
130
|
|
203
131
|
end
|
204
132
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'active_model'
|
2
|
+
|
3
|
+
module Sequent
|
4
|
+
module Core
|
5
|
+
module Helpers
|
6
|
+
# Validates DateTimes
|
7
|
+
# Automatically included when using a
|
8
|
+
#
|
9
|
+
# attrs value: DateTime
|
10
|
+
class DateTimeValidator < ActiveModel::EachValidator
|
11
|
+
def validate_each(subject, attribute, value)
|
12
|
+
return if value.is_a?(DateTime)
|
13
|
+
DateTime.deserialize_from_json(value)
|
14
|
+
rescue
|
15
|
+
subject.errors.add attribute, :invalid_date_time
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'active_model'
|
2
|
+
require_relative 'value_validators'
|
3
|
+
|
4
|
+
module Sequent
|
5
|
+
module Core
|
6
|
+
module Helpers
|
7
|
+
# Validates Dates
|
8
|
+
# Automatically included when using a
|
9
|
+
#
|
10
|
+
# attrs value: Date
|
11
|
+
class DateValidator < ActiveModel::EachValidator
|
12
|
+
def validate_each(subject, attribute, value)
|
13
|
+
subject.errors.add attribute, :invalid_date unless Sequent::Core::Helpers::ValueValidators.for(Date).valid_value?(value)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Sequent
|
2
|
+
module Core
|
3
|
+
module Helpers
|
4
|
+
class DefaultValidators
|
5
|
+
VALIDATORS = {
|
6
|
+
Integer => ->(klass, field) { klass.validates_numericality_of field, only_integer: true, allow_nil: true, allow_blank: true },
|
7
|
+
Date => ->(klass, field) { klass.validates field, "sequent::Core::Helpers::Date" => true },
|
8
|
+
DateTime => ->(klass, field) { klass.validates field, "sequent::Core::Helpers::DateTime" => true }
|
9
|
+
}
|
10
|
+
|
11
|
+
def self.for(type)
|
12
|
+
new(type)
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(type)
|
16
|
+
@type = type
|
17
|
+
end
|
18
|
+
|
19
|
+
def add_validations_for(klass, field)
|
20
|
+
validator = VALIDATORS[@type]
|
21
|
+
validator.call(klass, field) if validator
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -1,9 +1,13 @@
|
|
1
1
|
require_relative 'uuid_helper'
|
2
2
|
require_relative 'copyable'
|
3
|
+
require_relative 'value_validators'
|
4
|
+
require_relative 'string_to_value_parsers'
|
3
5
|
require_relative 'attribute_support'
|
4
6
|
require_relative 'equal_support'
|
5
7
|
require_relative 'param_support'
|
6
8
|
require_relative 'mergable'
|
7
9
|
require_relative 'association_validator'
|
8
10
|
require_relative 'string_support'
|
9
|
-
require_relative '
|
11
|
+
require_relative 'type_conversion_support'
|
12
|
+
require_relative 'date_validator'
|
13
|
+
require_relative 'date_time_validator'
|
@@ -22,8 +22,6 @@ module Sequent
|
|
22
22
|
value = type.from_params(value)
|
23
23
|
elsif type.is_a? Sequent::Core::Helpers::ArrayWithType
|
24
24
|
value = value.map { |v| type.item_type.from_params(v) }
|
25
|
-
elsif type <= Date
|
26
|
-
value = Date.strptime(value, "%d-%m-%Y") if value
|
27
25
|
end
|
28
26
|
result.instance_variable_set(:"@#{attribute}", value)
|
29
27
|
end
|
@@ -49,8 +47,10 @@ module Sequent
|
|
49
47
|
value = value.as_params
|
50
48
|
elsif value.kind_of?(Array)
|
51
49
|
value = value.map { |val| val.kind_of?(ValueObject) ? val.as_params : val }
|
52
|
-
elsif value.
|
53
|
-
value = value.
|
50
|
+
elsif value.is_a? DateTime
|
51
|
+
value = value.iso8601
|
52
|
+
elsif value.is_a? Date
|
53
|
+
value = value.strftime("%d-%m-%Y") # TODO Remove to TypeConverter
|
54
54
|
end
|
55
55
|
hash[field[0]] = value
|
56
56
|
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require_relative '../ext/ext'
|
2
|
+
require_relative 'array_with_type'
|
3
|
+
|
4
|
+
module Sequent
|
5
|
+
module Core
|
6
|
+
module Helpers
|
7
|
+
class StringToValueParsers
|
8
|
+
PARSERS = {
|
9
|
+
::Symbol => ->(value) { Symbol.deserialize_from_json(value) },
|
10
|
+
::String => ->(value) { value },
|
11
|
+
::Integer => ->(value) { parse_to_integer(value) },
|
12
|
+
::Boolean => ->(value) { parse_to_bool(value) },
|
13
|
+
::Date => ->(value) { parse_to_date(value) },
|
14
|
+
::DateTime => ->(value) { parse_to_date_time(value) },
|
15
|
+
::Sequent::Core::Helpers::ArrayWithType => ->(values, type_in_array) { parse_array(values, type_in_array) }
|
16
|
+
}
|
17
|
+
|
18
|
+
def self.parse_to_integer(value)
|
19
|
+
Integer(value) unless value.blank?
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.parse_to_bool(value)
|
23
|
+
if value.blank? && !(value.is_a?(TrueClass) || value.is_a?(FalseClass))
|
24
|
+
nil
|
25
|
+
else
|
26
|
+
(value.is_a?(TrueClass) || value == "true")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.parse_to_date(value)
|
31
|
+
return if value.blank?
|
32
|
+
value.is_a?(Date) ? value : Date.strptime(value, "%d-%m-%Y")
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.parse_to_date_time(value)
|
36
|
+
value.is_a?(DateTime) ? value : DateTime.deserialize_from_json(value)
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.parse_array(values, type_in_array)
|
40
|
+
values.map do |item|
|
41
|
+
if item.respond_to?(:parse_attrs_to_correct_types)
|
42
|
+
item.parse_attrs_to_correct_types
|
43
|
+
else
|
44
|
+
Sequent::Core::Helpers::StringToValueParsers.for(type_in_array).parse_from_string(item)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.for(klass)
|
50
|
+
new(klass)
|
51
|
+
end
|
52
|
+
|
53
|
+
def initialize(klass)
|
54
|
+
if klass.is_a? Sequent::Core::Helpers::ArrayWithType
|
55
|
+
@array_with_type = klass
|
56
|
+
@klass = klass.class
|
57
|
+
else
|
58
|
+
@klass = klass
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def parse_from_string(value)
|
63
|
+
parser = PARSERS[@klass]
|
64
|
+
if @array_with_type
|
65
|
+
parser.call(value, @array_with_type.item_type)
|
66
|
+
else
|
67
|
+
parser.call(value)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'active_model'
|
2
|
+
|
3
|
+
module Sequent
|
4
|
+
module Core
|
5
|
+
module Helpers
|
6
|
+
# Will parse all values to the correct types.
|
7
|
+
# The raw values are typically posted from the web and are therefor mostly strings.
|
8
|
+
# To parse a raw value your class must have a parse_from_string method that returns the parsed values.
|
9
|
+
# See sequent/core/ext for currently supported classes.
|
10
|
+
module TypeConversionSupport
|
11
|
+
def parse_attrs_to_correct_types
|
12
|
+
the_copy = dup
|
13
|
+
the_copy.attributes.each do |name, type|
|
14
|
+
raw_value = the_copy.send("#{name}")
|
15
|
+
next if raw_value.nil?
|
16
|
+
if raw_value.respond_to?(:parse_attrs_to_correct_types)
|
17
|
+
the_copy.send("#{name}=", raw_value.parse_attrs_to_correct_types)
|
18
|
+
else
|
19
|
+
parsed_value = Sequent::Core::Helpers::StringToValueParsers.for(type).parse_from_string(raw_value)
|
20
|
+
the_copy.send("#{name}=", parsed_value)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
the_copy
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require_relative '../ext/ext'
|
2
|
+
|
3
|
+
module Sequent
|
4
|
+
module Core
|
5
|
+
module Helpers
|
6
|
+
class ValueValidators
|
7
|
+
VALIDATORS = {
|
8
|
+
::Symbol => ->(_) { true },
|
9
|
+
::String => ->(value) { value.nil? || value.is_a?(String) },
|
10
|
+
::Integer => ->(value) { valid_integer?(value) },
|
11
|
+
::Boolean => ->(value) { valid_bool?(value) },
|
12
|
+
::Date => ->(value) { valid_date?(value) },
|
13
|
+
::DateTime => ->(value) { valid_date_time?(value) }
|
14
|
+
}
|
15
|
+
|
16
|
+
def self.valid_integer?(value)
|
17
|
+
value.blank? || Integer(value)
|
18
|
+
rescue
|
19
|
+
false
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.valid_bool?(value)
|
23
|
+
return true if value.blank?
|
24
|
+
value.is_a?(TrueClass) || value.is_a?(FalseClass) || value == "true" || value == "false"
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.valid_date?(value)
|
28
|
+
return true if value.blank?
|
29
|
+
return true if value.is_a?(Date)
|
30
|
+
return false unless value =~ /\d{2}-\d{2}-\d{4}/
|
31
|
+
!!Date.strptime(value, "%d-%m-%Y") rescue false
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.valid_date_time?(value)
|
35
|
+
return true if value.blank?
|
36
|
+
value.is_a?(DateTime) || !!DateTime.iso8601(value.dup) rescue false
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.for(klass)
|
40
|
+
new(klass)
|
41
|
+
end
|
42
|
+
|
43
|
+
def initialize(klass)
|
44
|
+
@klass = klass
|
45
|
+
end
|
46
|
+
|
47
|
+
def valid_value?(value)
|
48
|
+
VALIDATORS[@klass].call(value)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sequent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lars Vonk
|
@@ -131,17 +131,24 @@ files:
|
|
131
131
|
- lib/sequent/core/event.rb
|
132
132
|
- lib/sequent/core/event_record.rb
|
133
133
|
- lib/sequent/core/event_store.rb
|
134
|
+
- lib/sequent/core/ext/ext.rb
|
135
|
+
- lib/sequent/core/helpers/array_with_type.rb
|
134
136
|
- lib/sequent/core/helpers/association_validator.rb
|
135
137
|
- lib/sequent/core/helpers/attribute_support.rb
|
136
|
-
- lib/sequent/core/helpers/boolean_support.rb
|
137
138
|
- lib/sequent/core/helpers/copyable.rb
|
139
|
+
- lib/sequent/core/helpers/date_time_validator.rb
|
140
|
+
- lib/sequent/core/helpers/date_validator.rb
|
141
|
+
- lib/sequent/core/helpers/default_validators.rb
|
138
142
|
- lib/sequent/core/helpers/equal_support.rb
|
139
143
|
- lib/sequent/core/helpers/helpers.rb
|
140
144
|
- lib/sequent/core/helpers/mergable.rb
|
141
145
|
- lib/sequent/core/helpers/param_support.rb
|
142
146
|
- lib/sequent/core/helpers/self_applier.rb
|
143
147
|
- lib/sequent/core/helpers/string_support.rb
|
148
|
+
- lib/sequent/core/helpers/string_to_value_parsers.rb
|
149
|
+
- lib/sequent/core/helpers/type_conversion_support.rb
|
144
150
|
- lib/sequent/core/helpers/uuid_helper.rb
|
151
|
+
- lib/sequent/core/helpers/value_validators.rb
|
145
152
|
- lib/sequent/core/record_sessions/active_record_session.rb
|
146
153
|
- lib/sequent/core/record_sessions/record_sessions.rb
|
147
154
|
- lib/sequent/core/record_sessions/replay_events_session.rb
|
@@ -181,3 +188,4 @@ signing_key:
|
|
181
188
|
specification_version: 4
|
182
189
|
summary: Event sourcing framework for Ruby
|
183
190
|
test_files: []
|
191
|
+
has_rdoc:
|
@@ -1,36 +0,0 @@
|
|
1
|
-
module Sequent
|
2
|
-
module Core
|
3
|
-
module Helpers
|
4
|
-
#
|
5
|
-
# Parses the strings "true", "false" and nil to true, false, false
|
6
|
-
#
|
7
|
-
# You need to include this module explicitly when working with booleans.
|
8
|
-
#
|
9
|
-
# Example:
|
10
|
-
#
|
11
|
-
# class Registration < Sequent::Core::ValueObject
|
12
|
-
# include Sequent::Core::Helpers::BooleanSupport
|
13
|
-
# attrs accepted_terms: Boolean
|
14
|
-
# end
|
15
|
-
module BooleanSupport
|
16
|
-
|
17
|
-
def self.included(base)
|
18
|
-
base.before_validation :parse_booleans
|
19
|
-
end
|
20
|
-
|
21
|
-
def parse_booleans
|
22
|
-
attributes.each do |name, type|
|
23
|
-
if type == Boolean
|
24
|
-
raw_value = self.instance_variable_get("@#{name}")
|
25
|
-
return if raw_value.kind_of? Boolean
|
26
|
-
return unless [nil, "true", "false"].include?(raw_value)
|
27
|
-
bool_value = raw_value == "true" ? true : false
|
28
|
-
self.instance_variable_set "@#{name}", bool_value
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|