necromancer 0.3.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +70 -3
- data/README.md +204 -86
- data/lib/necromancer.rb +17 -18
- data/lib/necromancer/configuration.rb +1 -1
- data/lib/necromancer/context.rb +16 -3
- data/lib/necromancer/conversion_target.rb +31 -14
- data/lib/necromancer/conversions.rb +39 -16
- data/lib/necromancer/converter.rb +10 -8
- data/lib/necromancer/converters/array.rb +143 -45
- data/lib/necromancer/converters/boolean.rb +21 -19
- data/lib/necromancer/converters/date_time.rb +58 -13
- data/lib/necromancer/converters/hash.rb +119 -0
- data/lib/necromancer/converters/numeric.rb +32 -28
- data/lib/necromancer/converters/range.rb +44 -18
- data/lib/necromancer/null_converter.rb +4 -2
- data/lib/necromancer/version.rb +2 -2
- metadata +39 -72
- data/.gitignore +0 -14
- data/.rspec +0 -3
- data/.ruby-version +0 -1
- data/.travis.yml +0 -19
- data/Gemfile +0 -16
- data/Rakefile +0 -8
- data/necromancer.gemspec +0 -21
- data/spec/spec_helper.rb +0 -53
- data/spec/unit/can_spec.rb +0 -11
- data/spec/unit/config_spec.rb +0 -32
- data/spec/unit/configuration/new_spec.rb +0 -30
- data/spec/unit/conversions/register_spec.rb +0 -49
- data/spec/unit/convert_spec.rb +0 -104
- data/spec/unit/converters/array/array_to_boolean_spec.rb +0 -22
- data/spec/unit/converters/array/array_to_numeric_spec.rb +0 -22
- data/spec/unit/converters/array/array_to_set_spec.rb +0 -18
- data/spec/unit/converters/array/object_to_array_spec.rb +0 -21
- data/spec/unit/converters/array/string_to_array_spec.rb +0 -33
- data/spec/unit/converters/boolean/boolean_to_integer_spec.rb +0 -26
- data/spec/unit/converters/boolean/integer_to_boolean_spec.rb +0 -22
- data/spec/unit/converters/boolean/string_to_boolean_spec.rb +0 -36
- data/spec/unit/converters/date_time/string_to_date_spec.rb +0 -22
- data/spec/unit/converters/date_time/string_to_datetime_spec.rb +0 -32
- data/spec/unit/converters/numeric/string_to_float_spec.rb +0 -48
- data/spec/unit/converters/numeric/string_to_integer_spec.rb +0 -62
- data/spec/unit/converters/numeric/string_to_numeric_spec.rb +0 -32
- data/spec/unit/converters/range/string_to_range_spec.rb +0 -35
- data/spec/unit/new_spec.rb +0 -12
- data/spec/unit/register_spec.rb +0 -17
- data/tasks/console.rake +0 -10
- data/tasks/coverage.rake +0 -11
- data/tasks/spec.rake +0 -29
data/lib/necromancer.rb
CHANGED
@@ -1,21 +1,7 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
require 'set'
|
6
|
-
|
7
|
-
require 'necromancer/conversions'
|
8
|
-
require 'necromancer/configuration'
|
9
|
-
require 'necromancer/context'
|
10
|
-
require 'necromancer/converter'
|
11
|
-
require 'necromancer/null_converter'
|
12
|
-
require 'necromancer/converters/array'
|
13
|
-
require 'necromancer/converters/boolean'
|
14
|
-
require 'necromancer/converters/date_time'
|
15
|
-
require 'necromancer/converters/numeric'
|
16
|
-
require 'necromancer/converters/range'
|
17
|
-
require 'necromancer/conversion_target'
|
18
|
-
require 'necromancer/version'
|
3
|
+
require_relative "necromancer/context"
|
4
|
+
require_relative "necromancer/version"
|
19
5
|
|
20
6
|
module Necromancer
|
21
7
|
# Raised when cannot conver to a given type
|
@@ -35,6 +21,19 @@ module Necromancer
|
|
35
21
|
def new(&block)
|
36
22
|
Context.new(&block)
|
37
23
|
end
|
38
|
-
|
39
24
|
module_function :new
|
25
|
+
|
26
|
+
# Convenience to directly call conversion
|
27
|
+
#
|
28
|
+
# @example
|
29
|
+
# Necromancer.convert("1").to(:integer)
|
30
|
+
# # => 1
|
31
|
+
#
|
32
|
+
# @return [ConversionTarget]
|
33
|
+
#
|
34
|
+
# @api public
|
35
|
+
def convert(*args, &block)
|
36
|
+
Context.new.convert(*args, &block)
|
37
|
+
end
|
38
|
+
module_function :convert
|
40
39
|
end # Necromancer
|
data/lib/necromancer/context.rb
CHANGED
@@ -1,4 +1,10 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "forwardable"
|
4
|
+
|
5
|
+
require_relative "configuration"
|
6
|
+
require_relative "conversions"
|
7
|
+
require_relative "conversion_target"
|
2
8
|
|
3
9
|
module Necromancer
|
4
10
|
# A class used by Necromancer to provide user interace
|
@@ -13,7 +19,7 @@ module Necromancer
|
|
13
19
|
#
|
14
20
|
# @api private
|
15
21
|
def initialize(&block)
|
16
|
-
block.
|
22
|
+
block.(configuration) if block_given?
|
17
23
|
@conversions = Conversions.new(configuration)
|
18
24
|
@conversions.load
|
19
25
|
end
|
@@ -47,7 +53,7 @@ module Necromancer
|
|
47
53
|
end
|
48
54
|
|
49
55
|
# Converts the object
|
50
|
-
# @param [Object]
|
56
|
+
# @param [Object] object
|
51
57
|
# any object to be converted
|
52
58
|
#
|
53
59
|
# @api public
|
@@ -71,6 +77,13 @@ module Necromancer
|
|
71
77
|
false
|
72
78
|
end
|
73
79
|
|
80
|
+
# Inspect this context
|
81
|
+
#
|
82
|
+
# @api public
|
83
|
+
def inspect
|
84
|
+
%(#<#{self.class}@#{object_id} @config=#{configuration}>)
|
85
|
+
end
|
86
|
+
|
74
87
|
protected
|
75
88
|
|
76
89
|
attr_reader :conversions
|
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Necromancer
|
4
4
|
# A class responsible for wrapping conversion target
|
@@ -19,13 +19,13 @@ module Necromancer
|
|
19
19
|
def self.for(context, value, block)
|
20
20
|
if UndefinedValue.equal?(value)
|
21
21
|
unless block
|
22
|
-
|
23
|
-
|
22
|
+
raise ArgumentError,
|
23
|
+
"You need to pass either argument or a block to `convert`."
|
24
24
|
end
|
25
25
|
new(context, block.call)
|
26
26
|
elsif block
|
27
|
-
|
28
|
-
|
27
|
+
raise ArgumentError,
|
28
|
+
"You cannot pass both an argument and a block to `convert`."
|
29
29
|
else
|
30
30
|
new(context, value)
|
31
31
|
end
|
@@ -34,7 +34,7 @@ module Necromancer
|
|
34
34
|
# Allows to specify conversion source type
|
35
35
|
#
|
36
36
|
# @example
|
37
|
-
# converter.convert(
|
37
|
+
# converter.convert("1").from(:string).to(:numeric) # => 1
|
38
38
|
#
|
39
39
|
# @return [ConversionType]
|
40
40
|
#
|
@@ -47,29 +47,46 @@ module Necromancer
|
|
47
47
|
# Runs a given conversion
|
48
48
|
#
|
49
49
|
# @example
|
50
|
-
# converter.convert(
|
50
|
+
# converter.convert("1").to(:numeric) # => 1
|
51
|
+
#
|
52
|
+
# @example
|
53
|
+
# converter.convert("1") >> Integer # => 1
|
51
54
|
#
|
52
55
|
# @return [Object]
|
53
56
|
# the converted target type
|
54
57
|
#
|
55
58
|
# @api public
|
56
59
|
def to(target, options = {})
|
57
|
-
conversion = conversions[source || detect(object), detect(target)]
|
58
|
-
conversion.call(object, options)
|
60
|
+
conversion = conversions[source || detect(object, false), detect(target)]
|
61
|
+
conversion.call(object, **options)
|
62
|
+
end
|
63
|
+
alias >> to
|
64
|
+
|
65
|
+
# Inspect this conversion
|
66
|
+
#
|
67
|
+
# @api public
|
68
|
+
def inspect
|
69
|
+
%(#<#{self.class}@#{object_id} @object=#{object}, @source=#{detect(object)}>)
|
59
70
|
end
|
60
71
|
|
61
72
|
protected
|
62
73
|
|
63
|
-
# Detect object type
|
74
|
+
# Detect object type and coerce into known key type
|
75
|
+
#
|
76
|
+
# @param [Object] object
|
64
77
|
#
|
65
78
|
# @api private
|
66
|
-
def detect(object)
|
79
|
+
def detect(object, symbol_as_object = true)
|
67
80
|
case object
|
68
81
|
when TrueClass, FalseClass then :boolean
|
69
|
-
when
|
70
|
-
when
|
82
|
+
when Integer then :integer
|
83
|
+
when Class then object.name.downcase
|
71
84
|
else
|
72
|
-
object.
|
85
|
+
if object.is_a?(Symbol) && symbol_as_object
|
86
|
+
object
|
87
|
+
else
|
88
|
+
object.class.name.downcase
|
89
|
+
end
|
73
90
|
end
|
74
91
|
end
|
75
92
|
|
@@ -1,4 +1,13 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "configuration"
|
4
|
+
require_relative "converter"
|
5
|
+
require_relative "converters/array"
|
6
|
+
require_relative "converters/boolean"
|
7
|
+
require_relative "converters/date_time"
|
8
|
+
require_relative "converters/hash"
|
9
|
+
require_relative "converters/numeric"
|
10
|
+
require_relative "converters/range"
|
2
11
|
|
3
12
|
module Necromancer
|
4
13
|
# Represents the context used to configure various converters
|
@@ -6,7 +15,7 @@ module Necromancer
|
|
6
15
|
#
|
7
16
|
# @api public
|
8
17
|
class Conversions
|
9
|
-
DELIMITER =
|
18
|
+
DELIMITER = "->"
|
10
19
|
|
11
20
|
# Creates a new conversions map
|
12
21
|
#
|
@@ -14,9 +23,9 @@ module Necromancer
|
|
14
23
|
# conversion = Necromancer::Conversions.new
|
15
24
|
#
|
16
25
|
# @api public
|
17
|
-
def initialize(configuration = Configuration.new)
|
26
|
+
def initialize(configuration = Configuration.new, map = {})
|
18
27
|
@configuration = configuration
|
19
|
-
@converter_map =
|
28
|
+
@converter_map = map.dup
|
20
29
|
end
|
21
30
|
|
22
31
|
# Load converters
|
@@ -26,6 +35,7 @@ module Necromancer
|
|
26
35
|
ArrayConverters.load(self)
|
27
36
|
BooleanConverters.load(self)
|
28
37
|
DateTimeConverters.load(self)
|
38
|
+
HashConverters.load(self)
|
29
39
|
NumericConverters.load(self)
|
30
40
|
RangeConverters.load(self)
|
31
41
|
end
|
@@ -45,22 +55,22 @@ module Necromancer
|
|
45
55
|
def [](source, target)
|
46
56
|
key = "#{source}#{DELIMITER}#{target}"
|
47
57
|
converter_map[key] ||
|
48
|
-
|
49
|
-
|
58
|
+
converter_map["object#{DELIMITER}#{target}"] ||
|
59
|
+
raise_no_type_conversion_available(key)
|
50
60
|
end
|
61
|
+
alias fetch []
|
51
62
|
|
52
|
-
#
|
63
|
+
# Register a converter
|
53
64
|
#
|
54
|
-
# @api private
|
55
|
-
def fail_no_type_conversion_available(key)
|
56
|
-
fail NoTypeConversionAvailableError, "Conversion '#{key}' unavailable."
|
57
|
-
end
|
58
|
-
|
59
65
|
# @example with simple object
|
60
|
-
#
|
66
|
+
# conversions.register NullConverter.new(:array, :array)
|
61
67
|
#
|
62
68
|
# @example with block
|
63
|
-
#
|
69
|
+
# conversions.register do |c|
|
70
|
+
# c.source = :array
|
71
|
+
# c.target = :array
|
72
|
+
# c.convert = -> { |val, options| val }
|
73
|
+
# end
|
64
74
|
#
|
65
75
|
# @api public
|
66
76
|
def register(converter = nil, &block)
|
@@ -68,21 +78,34 @@ module Necromancer
|
|
68
78
|
key = generate_key(converter)
|
69
79
|
converter = add_config(converter, @configuration)
|
70
80
|
return false if converter_map.key?(key)
|
81
|
+
|
71
82
|
converter_map[key] = converter
|
72
83
|
true
|
73
84
|
end
|
74
85
|
|
86
|
+
# Export all the conversions as hash
|
87
|
+
#
|
88
|
+
# @return [Hash[String, String]]
|
89
|
+
#
|
90
|
+
# @api public
|
75
91
|
def to_hash
|
76
92
|
converter_map.dup
|
77
93
|
end
|
78
94
|
|
79
95
|
protected
|
80
96
|
|
97
|
+
# Fail with conversion error
|
98
|
+
#
|
99
|
+
# @api private
|
100
|
+
def raise_no_type_conversion_available(key)
|
101
|
+
raise NoTypeConversionAvailableError, "Conversion '#{key}' unavailable."
|
102
|
+
end
|
103
|
+
|
81
104
|
# @api private
|
82
105
|
def generate_key(converter)
|
83
106
|
parts = []
|
84
|
-
parts << (converter.source ? converter.source.to_s :
|
85
|
-
parts << (converter.target ? converter.target.to_s :
|
107
|
+
parts << (converter.source ? converter.source.to_s : "none")
|
108
|
+
parts << (converter.target ? converter.target.to_s : "none")
|
86
109
|
parts.join(DELIMITER)
|
87
110
|
end
|
88
111
|
|
@@ -1,4 +1,6 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "configuration"
|
2
4
|
|
3
5
|
module Necromancer
|
4
6
|
# Abstract converter used internally as a base for other converters
|
@@ -24,7 +26,7 @@ module Necromancer
|
|
24
26
|
#
|
25
27
|
# @api private
|
26
28
|
def call(*)
|
27
|
-
|
29
|
+
raise NotImplementedError
|
28
30
|
end
|
29
31
|
|
30
32
|
# Creates anonymous converter
|
@@ -32,9 +34,9 @@ module Necromancer
|
|
32
34
|
# @api private
|
33
35
|
def self.create(&block)
|
34
36
|
Class.new(self) do
|
35
|
-
define_method(:initialize) { |*a| block.
|
37
|
+
define_method(:initialize) { |*a| block.(self, *a) }
|
36
38
|
|
37
|
-
define_method(:call) { |value| convert.
|
39
|
+
define_method(:call) { |value| convert.(value) }
|
38
40
|
end.new
|
39
41
|
end
|
40
42
|
|
@@ -44,9 +46,9 @@ module Necromancer
|
|
44
46
|
# the value that cannot be converted
|
45
47
|
#
|
46
48
|
# @api private
|
47
|
-
def
|
48
|
-
|
49
|
-
|
49
|
+
def raise_conversion_type(value)
|
50
|
+
raise ConversionTypeError, "'#{value}' could not be converted " \
|
51
|
+
"from `#{source}` into `#{target}`"
|
50
52
|
end
|
51
53
|
|
52
54
|
attr_accessor :source
|
@@ -55,7 +57,7 @@ module Necromancer
|
|
55
57
|
|
56
58
|
attr_accessor :convert
|
57
59
|
|
58
|
-
|
60
|
+
# protected
|
59
61
|
|
60
62
|
attr_reader :config
|
61
63
|
end # Converter
|
@@ -1,65 +1,150 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "set"
|
4
|
+
|
5
|
+
require_relative "../converter"
|
6
|
+
require_relative "boolean"
|
7
|
+
require_relative "numeric"
|
2
8
|
|
3
9
|
module Necromancer
|
4
10
|
# Container for Array converter classes
|
5
11
|
module ArrayConverters
|
12
|
+
ARRAY_MATCHER = /^(.+?(\s*(?<sep>(,|-))\s*))+/x.freeze
|
13
|
+
|
6
14
|
# An object that converts a String to an Array
|
7
15
|
class StringToArrayConverter < Converter
|
8
16
|
# Convert string value to array
|
9
17
|
#
|
10
18
|
# @example
|
11
|
-
# converter.call(
|
19
|
+
# converter.call("a, b, c") # => ["a", "b", "c"]
|
12
20
|
#
|
13
21
|
# @example
|
14
|
-
# converter.call(
|
22
|
+
# converter.call("1 - 2 - 3") # => ["1", "2", "3"]
|
15
23
|
#
|
16
24
|
# @api public
|
17
|
-
def call(value,
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
value.to_s.split(
|
22
|
-
when /^((\w)(\s*(,|-)\s*)?)+$/
|
23
|
-
value.to_s.split($4)
|
25
|
+
def call(value, strict: config.strict)
|
26
|
+
return [] if value.to_s.empty?
|
27
|
+
|
28
|
+
if match = value.to_s.match(ARRAY_MATCHER)
|
29
|
+
value.to_s.split(match[:sep])
|
24
30
|
else
|
25
|
-
strict ?
|
31
|
+
strict ? raise_conversion_type(value) : Array(value)
|
26
32
|
end
|
27
33
|
end
|
28
34
|
end
|
29
35
|
|
36
|
+
class StringToBooleanArrayConverter < Converter
|
37
|
+
# @example
|
38
|
+
# converter.call("t,f,yes,no") # => [true, false, true, false]
|
39
|
+
#
|
40
|
+
# @param [Array] value
|
41
|
+
# the array value to boolean
|
42
|
+
#
|
43
|
+
# @api public
|
44
|
+
def call(value, strict: config.strict)
|
45
|
+
array_converter = StringToArrayConverter.new(:string, :array)
|
46
|
+
array = array_converter.(value, strict: strict)
|
47
|
+
bool_converter = ArrayToBooleanArrayConverter.new(:array, :boolean)
|
48
|
+
bool_converter.(array, strict: strict)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class StringToIntegerArrayConverter < Converter
|
53
|
+
# @example
|
54
|
+
# converter.call("1,2,3") # => [1, 2, 3]
|
55
|
+
#
|
56
|
+
# @api public
|
57
|
+
def call(string, strict: config.strict)
|
58
|
+
array_converter = StringToArrayConverter.new(:string, :array)
|
59
|
+
array = array_converter.(string, strict: strict)
|
60
|
+
int_converter = ArrayToIntegerArrayConverter.new(:array, :integers)
|
61
|
+
int_converter.(array, strict: strict)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
class StringToFloatArrayConverter < Converter
|
66
|
+
# @example
|
67
|
+
# converter.call("1,2,3") # => [1.0, 2.0, 3.0]
|
68
|
+
#
|
69
|
+
# @api public
|
70
|
+
def call(string, strict: config.strict)
|
71
|
+
array_converter = StringToArrayConverter.new(:string, :array)
|
72
|
+
array = array_converter.(string, strict: strict)
|
73
|
+
float_converter = ArrayToFloatArrayConverter.new(:array, :floats)
|
74
|
+
float_converter.(array, strict: strict)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
class StringToNumericArrayConverter < Converter
|
79
|
+
# Convert string value to array with numeric values
|
80
|
+
#
|
81
|
+
# @example
|
82
|
+
# converter.call("1,2.0,3") # => [1, 2.0, 3]
|
83
|
+
#
|
84
|
+
# @api public
|
85
|
+
def call(string, strict: config.strict)
|
86
|
+
array_converter = StringToArrayConverter.new(:string, :array)
|
87
|
+
array = array_converter.(string, strict: strict)
|
88
|
+
num_converter = ArrayToNumericArrayConverter.new(:array, :numeric)
|
89
|
+
num_converter.(array, strict: strict)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
class ArrayToIntegerArrayConverter < Converter
|
94
|
+
# @example
|
95
|
+
# converter.call(["1", "2", "3"]) # => [1, 2, 3]
|
96
|
+
#
|
97
|
+
# @api public
|
98
|
+
def call(array, strict: config.strict)
|
99
|
+
int_converter = NumericConverters::StringToIntegerConverter.new(:string,
|
100
|
+
:integer)
|
101
|
+
array.map { |val| int_converter.(val, strict: strict) }
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
class ArrayToFloatArrayConverter < Converter
|
106
|
+
# @example
|
107
|
+
# converter.call(["1", "2", "3"]) # => [1.0, 2.0, 3.0]
|
108
|
+
#
|
109
|
+
# @api public
|
110
|
+
def call(array, strict: config.strict)
|
111
|
+
float_converter = NumericConverters::StringToFloatConverter.new(:string,
|
112
|
+
:float)
|
113
|
+
array.map { |val| float_converter.(val, strict: strict) }
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
30
117
|
# An object that converts an array to an array with numeric values
|
31
|
-
class
|
118
|
+
class ArrayToNumericArrayConverter < Converter
|
32
119
|
# Convert an array to an array of numeric values
|
33
120
|
#
|
34
121
|
# @example
|
35
|
-
# converter.call([
|
122
|
+
# converter.call(["1", "2.3", "3.0]) # => [1, 2.3, 3.0]
|
36
123
|
#
|
37
124
|
# @param [Array] value
|
38
125
|
# the value to convert
|
39
126
|
#
|
40
127
|
# @api public
|
41
|
-
def call(value,
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
end
|
128
|
+
def call(value, strict: config.strict)
|
129
|
+
num_converter = NumericConverters::StringToNumericConverter.new(:string,
|
130
|
+
:numeric)
|
131
|
+
value.map { |val| num_converter.(val, strict: strict) }
|
46
132
|
end
|
47
133
|
end
|
48
134
|
|
49
135
|
# An object that converts an array to an array with boolean values
|
50
|
-
class
|
136
|
+
class ArrayToBooleanArrayConverter < Converter
|
51
137
|
# @example
|
52
|
-
# converter.call([
|
138
|
+
# converter.call(["t", "f", "yes", "no"]) # => [true, false, true, false]
|
53
139
|
#
|
54
140
|
# @param [Array] value
|
55
141
|
# the array value to boolean
|
56
142
|
#
|
57
143
|
# @api public
|
58
|
-
def call(value,
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
end
|
144
|
+
def call(value, strict: config.strict)
|
145
|
+
bool_converter = BooleanConverters::StringToBooleanConverter.new(:string,
|
146
|
+
:boolean)
|
147
|
+
value.map { |val| bool_converter.(val, strict: strict) }
|
63
148
|
end
|
64
149
|
end
|
65
150
|
|
@@ -71,13 +156,10 @@ module Necromancer
|
|
71
156
|
# converter.call({x: 1}) # => [[:x, 1]]
|
72
157
|
#
|
73
158
|
# @api public
|
74
|
-
def call(value,
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
rescue
|
79
|
-
strict ? fail_conversion_type(value) : value
|
80
|
-
end
|
159
|
+
def call(value, strict: config.strict)
|
160
|
+
Array(value)
|
161
|
+
rescue StandardError
|
162
|
+
strict ? raise_conversion_type(value) : value
|
81
163
|
end
|
82
164
|
end
|
83
165
|
|
@@ -92,23 +174,39 @@ module Necromancer
|
|
92
174
|
# the array to convert
|
93
175
|
#
|
94
176
|
# @api public
|
95
|
-
def call(value,
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
rescue
|
100
|
-
strict ? fail_conversion_type(value) : value
|
101
|
-
end
|
177
|
+
def call(value, strict: config.strict)
|
178
|
+
value.to_set
|
179
|
+
rescue StandardError
|
180
|
+
strict ? raise_conversion_type(value) : value
|
102
181
|
end
|
103
182
|
end
|
104
183
|
|
105
184
|
def self.load(conversions)
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
185
|
+
[
|
186
|
+
NullConverter.new(:array, :array),
|
187
|
+
|
188
|
+
StringToArrayConverter.new(:string, :array),
|
189
|
+
StringToBooleanArrayConverter.new(:string, :bools),
|
190
|
+
StringToBooleanArrayConverter.new(:string, :booleans),
|
191
|
+
StringToIntegerArrayConverter.new(:string, :integers),
|
192
|
+
StringToIntegerArrayConverter.new(:string, :ints),
|
193
|
+
StringToFloatArrayConverter.new(:string, :floats),
|
194
|
+
StringToNumericArrayConverter.new(:string, :numerics),
|
195
|
+
StringToNumericArrayConverter.new(:string, :nums),
|
196
|
+
|
197
|
+
ArrayToNumericArrayConverter.new(:array, :numerics),
|
198
|
+
ArrayToNumericArrayConverter.new(:array, :nums),
|
199
|
+
ArrayToIntegerArrayConverter.new(:array, :integers),
|
200
|
+
ArrayToIntegerArrayConverter.new(:array, :ints),
|
201
|
+
ArrayToFloatArrayConverter.new(:array, :floats),
|
202
|
+
ArrayToBooleanArrayConverter.new(:array, :booleans),
|
203
|
+
ArrayToBooleanArrayConverter.new(:array, :bools),
|
204
|
+
|
205
|
+
ObjectToArrayConverter.new(:object, :array),
|
206
|
+
ObjectToArrayConverter.new(:hash, :array)
|
207
|
+
].each do |converter|
|
208
|
+
conversions.register converter
|
209
|
+
end
|
112
210
|
end
|
113
211
|
end # ArrayConverters
|
114
212
|
end # Necromancer
|