foraneus 0.0.1 → 0.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.
@@ -1,46 +0,0 @@
1
- module Foraneus
2
-
3
- # Base class from which all the value_sets should inherit.
4
- #
5
- # Concrete classes model a set of params/values that are parsed from an external source (like HTTP query params)
6
- class ValueSet
7
-
8
- # Builds an instance of ValueSet that conforms with its fields specification.
9
- #
10
- # If any of the params can be parsed by its corresponding convertor then an
11
- # {InvalidValueSet} and {RawValueSet} is returned that holds raw_values
12
- #
13
- # @param [Hash<Symbol, String>] params Hash that holds values that will be parsed and associated
14
- # with the created ValueSet instance.
15
- # @return [ValueSet, InvalidValueSet, RawValueSet] A value_set
16
- def self.build(params = {})
17
- Foraneus::ValueSetBuilder.build(self, @meta, params)
18
- end
19
-
20
- # Builds an instance of ValueSet and raises an {ValueSetError} if invalid params.
21
- # @see .build
22
- # @param (see .build)
23
- def self.build!(params = {})
24
- value_set = self.build(params)
25
- if value_set.kind_of?(Foraneus::InvalidValueSet)
26
- raise Foraneus::ValueSetError.new(value_set)
27
- end
28
-
29
- value_set
30
- end
31
-
32
- # Returns a {RawValueSet} that corresponds to the given argument.
33
- #
34
- # @overload raw(value_set)
35
- # @param [ValueSet] value_set ValueSet whose raw value will be used to create a {RawValueSet}
36
- #
37
- # @overload raw(params)
38
- # @param [Hash] params Params for creating a {RawValueSet}
39
- #
40
- # @return [RawValueSet]
41
- def self.raw(vs_or_params)
42
- Foraneus::RawValueSetBuilder.build(self, @meta, vs_or_params)
43
- end
44
-
45
- end
46
- end
@@ -1,132 +0,0 @@
1
- module Foraneus
2
-
3
- # Module for building value_sets
4
- module ValueSetBuilder
5
-
6
- # Builds an instance of a value_set
7
- #
8
- # @param [Class<? extends ValueSet>] vs_class ValueSet subclass from with the value_set will be instantiated
9
- #
10
- # @param [Hash<Symbol, Symbol>] meta Hash with metainformation. Each key is a field name, and each value is the name of the converter to be used
11
- #
12
- # @param [Hash<Symbol, Object>] params Parameters that will be parsed and set as attributes for the newly value_set
13
- #
14
- # @return [ValueSet] An instance of (or an instance of subclass of) vs_class
15
- def self.build(vs_class, meta, params = {})
16
-
17
- parsed_params, raw_params, errors = self.parse_params(meta, params)
18
-
19
- if errors.empty?
20
- form = vs_class.new
21
- set_instance_vars(form, parsed_params)
22
- form.instance_variable_set(:@hash_values, parsed_params)
23
- else
24
- form = create_invalid_value_set(vs_class)
25
- set_instance_vars(form, raw_params)
26
- end
27
-
28
- form.instance_variable_set(:@valid, errors.empty?)
29
- form.instance_variable_set(:@errors, errors)
30
- form.instance_variable_set(:@raw_values, raw_params)
31
- form
32
- end
33
-
34
- # Creates a value_set marked as invalid.
35
- #
36
- # It creates a value set by creating an instance from a subclass of vs_class.
37
- # That subclass is mixed in with {InvalidValueSet} and {RawValueSet}
38
- #
39
- # @api private
40
- #
41
- # @param [Class<? extends ValueSet>] vs_class Subclass of ValueSet from which the invalid value_set
42
- # will be instantiated
43
- #
44
- # @return [ValueSet] A kind of ValueSet, mixed with {InvalidValueSet} and {RawValueSet}
45
- def self.create_invalid_value_set(vs_class)
46
- form_class = Class.new(vs_class) do
47
- include Foraneus::InvalidValueSet
48
- include Foraneus::RawValueSet
49
- end
50
- form = form_class.new
51
- end
52
-
53
- # Parses a given value.
54
- #
55
- # The converter is selected by querying the given metadata, searching for the given name.
56
- # @api private
57
- #
58
- # @param [Hash<Symbol, Symbol>] meta (see .build)
59
- # @param [Symbol] name Name of the field to be parsed
60
- # @param [String] value Value to be parsed
61
- #
62
- # @return [Array] An array of two elements. The first of them is the result of the parsing,
63
- # and the last one is a boolean value that indicates if an error occured during the parsing.
64
- def self.parse(meta, name, value)
65
- parsed_value = nil
66
- error = false
67
-
68
- parser_code = meta[name]
69
- parser = Foraneus.registry[parser_code]
70
-
71
- begin
72
- parsed_value = parser.parse(value)
73
- rescue StandardError => e
74
- error = true
75
- end
76
-
77
- [parsed_value, error]
78
- end
79
-
80
- # Parses each of the given params.
81
- #
82
- # The converter is select by searching for the param name in the metadata.
83
- # If a param is not expected by the metadata, then it is simply ignored.
84
- #
85
- # @api private
86
- #
87
- # @param [Hash<Symbol, Symbol>] meta (see .build)
88
- # @param [Hash<Symbol, Object>] params (see .build)
89
- #
90
- # @return [Array] An array consisting of three elements:
91
- # - Hash { Symbol => Object } Parsed params/values
92
- # - Hash { Symbol => Object } Given params/values, it only contains params that are present in the metadata.
93
- # - Hash { Symbol => {ValueError} } Errors ocurred during parsing, each key is the name of a field with an associated error
94
- def self.parse_params(meta, params)
95
- parsed_params = {}
96
- raw_params = {}
97
- errors = {}
98
-
99
- params.each do |name, value|
100
- normalized_name = name.to_sym
101
- next unless meta.include?(normalized_name)
102
-
103
- raw_params[name] = value
104
- parsed_value, error = self.parse(meta, normalized_name, value)
105
- unless error
106
- parsed_params[normalized_name] = parsed_value
107
- else
108
- errors[normalized_name] = Foraneus::ValueError.new(normalized_name, value, meta[normalized_name])
109
- end
110
- end
111
-
112
- [parsed_params, raw_params, errors]
113
- end
114
-
115
- # Sets instance variables to an object.
116
- #
117
- # @api private
118
- #
119
- # @param [Object] o The object to set the instance variables
120
- # @param [Hash<Symbol, Object>] params A hash with the names and values of instance variables that will be set.
121
- #
122
- # @return [Object] The received object with the instance variables set
123
- def self.set_instance_vars(o, params)
124
- params.each do |name, value|
125
- o.instance_variable_set("@#{name}", value)
126
- end
127
-
128
- o
129
- end
130
-
131
- end
132
- end