realize 1.0.0.pre.alpha.3 → 1.2.0.pre.alpha
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -1
- data/README.md +16 -6
- data/lib/realize.rb +1 -0
- data/lib/realize/collection/at_index.rb +24 -0
- data/lib/realize/collection/first.rb +14 -0
- data/lib/realize/collection/last.rb +14 -0
- data/lib/realize/collection/sort.rb +3 -7
- data/lib/realize/collection/sort/direction.rb +5 -27
- data/lib/realize/format/date.rb +2 -4
- data/lib/realize/transformers.rb +25 -2
- data/lib/realize/type/boolean.rb +37 -0
- data/lib/realize/type/string.rb +22 -0
- data/lib/realize/value/now.rb +24 -0
- data/lib/realize/value/uuid.rb +14 -0
- data/lib/realize/version.rb +1 -1
- data/realize.gemspec +3 -3
- metadata +21 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1a4e738840e298580fc77dfc5ace2d254b63373929c0b09b24783b3b3c639027
|
4
|
+
data.tar.gz: 64a75dcfb103323c9a5bedaad2ba16c9195e18410e860ca8c6a144329cdb488a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 57679313d416e0e331c563ef6b756bda9c77a22338812d435f563bf5cbe399e81ace68e183a4c4e897c4bbe719fd3b942fa2cde5bfeabe1dd536416ad9858a57
|
7
|
+
data.tar.gz: 2e3bddcec287597fa11b600488a088ca6f87ea9de75b985e656632f7d87e68c5fcd1de54eaf16d106ed2fbf2b5d1d00550abd1710df557def1c5ab54d376cf20
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,22 @@
|
|
1
|
-
# 1.
|
1
|
+
# 1.2.0 (TBD)
|
2
|
+
|
3
|
+
New Transformers:
|
4
|
+
|
5
|
+
* b/type/boolean
|
6
|
+
* b/type/string
|
7
|
+
* b/value/now
|
8
|
+
* b/value/uuid
|
9
|
+
|
10
|
+
# 1.1.1 (September 9th, 2020)
|
11
|
+
|
12
|
+
Fixes:
|
13
|
+
|
14
|
+
* Do not leverage #to_datetime even if it is available for date parsing. This removes un-intentional coupling of other libraries into Realize and keeps it based on Ruby standard and core libraries.
|
15
|
+
|
16
|
+
# 1.1.0 (June 24th, 2020)
|
17
|
+
|
18
|
+
Addition of r/collection/at_index, r/collection/first, and r/collection/last
|
19
|
+
|
20
|
+
# 1.0.0 (June 9th, 2020)
|
2
21
|
|
3
22
|
Initial Release, includes 15 initial transformers.
|
data/README.md
CHANGED
@@ -62,6 +62,9 @@ Here is a list of each built-in transformer, their options, and what their funct
|
|
62
62
|
|
63
63
|
#### Collection-oriented Transformers
|
64
64
|
|
65
|
+
* **r/collection/at_index** [index]: Takes an array (or coerces value to an array) and returns the value at the given index position.
|
66
|
+
* **r/collection/first** []: Takes an array (or coerces value to an array) and returns the value at the first index position.
|
67
|
+
* **r/collection/last** []: Takes an array (or coerces value to an array) and returns the value at the last index position.
|
65
68
|
* **r/collection/sort** [key, direction]: Takes an array (or coerces value to an array) and sort it either ascending or descending by some defined key's value.
|
66
69
|
|
67
70
|
#### Filtering Transformers
|
@@ -81,14 +84,21 @@ Here is a list of each built-in transformer, their options, and what their funct
|
|
81
84
|
|
82
85
|
* **r/logical/switch** [cases, default_transformers, key]: Provides a value-based logic branching. If a value matches a specific case, the specific cases transformers will be executed. If it does not match any case then the default_transformers will be executed.
|
83
86
|
|
87
|
+
#### Type Transformers
|
88
|
+
|
89
|
+
* **r/type/boolean** [nullable]: Returns `true` if the input is 'truthy', `false` if not. By default nullable is false, which means a nil input will return false. Changing this to true will return nil if nil is passed in. A 'truthy' value is defined as matching: true, t, yes, y, or 1 (case-insensitive).
|
90
|
+
* **r/type/string** []: Calls `#to_s` on the value so the returned value is guaranteed to be a string type.
|
91
|
+
|
84
92
|
#### Value-oriented Transformers
|
85
93
|
|
86
|
-
* **r/
|
87
|
-
* **r/
|
88
|
-
* **r/
|
89
|
-
* **r/
|
90
|
-
* **r/
|
91
|
-
* **r/
|
94
|
+
* **r/value/blank** []: Always return a blank string.
|
95
|
+
* **r/value/map** [values]: Do a lookup on the value using the `values` hash. If a value is found, then its corresponding value is returned. If it isn't then the input is returned.
|
96
|
+
* **r/value/now** [utc_offset]: Returns a Time object, defaulting to UTC offset. You can optionally pass in a different offset in the FORM: "+/-HH:MM"
|
97
|
+
* **r/value/null** []: Always returns null.
|
98
|
+
* **r/value/resolve** [key]: Dynamically resolves a value based on the record's key. It uses the [Objectable](https://github.com/bluemarblepayroll/objectable) library by default, which provides some goodies like dot-notation for nested objects and type-insensitivity (works for Ruby objects, hashes, structs, etc.)
|
99
|
+
* **r/value/static** [value]: Always returns a hard-coded value.
|
100
|
+
* **r/value/uuid** []: Returns a new 36 character UUID (i.e. 6967fec6-bbde-4497-82d9-55ccc7b87cd0)
|
101
|
+
* **r/value/verbatim** []: Default transformer, simply echos back the input.
|
92
102
|
|
93
103
|
### Plugging in Transformers
|
94
104
|
|
data/lib/realize.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Realize
|
4
|
+
class Collection
|
5
|
+
# Transformer to get an item of a collection
|
6
|
+
class AtIndex
|
7
|
+
acts_as_hashable
|
8
|
+
|
9
|
+
attr_reader :index
|
10
|
+
|
11
|
+
def initialize(index:)
|
12
|
+
raise ArgumentError, 'index is required' if index.to_s.empty?
|
13
|
+
|
14
|
+
@index = index.to_i
|
15
|
+
|
16
|
+
freeze
|
17
|
+
end
|
18
|
+
|
19
|
+
def transform(_resolver, value, _time, _record)
|
20
|
+
value.is_a?(Array) ? value[index] : value
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Realize
|
4
|
+
class Collection
|
5
|
+
# Transformer to get the first item of a collection
|
6
|
+
class First
|
7
|
+
acts_as_hashable
|
8
|
+
|
9
|
+
def transform(resolver, value, time, record)
|
10
|
+
AtIndex.new(index: 0).transform(resolver, value, time, record)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Realize
|
4
|
+
class Collection
|
5
|
+
# Transformer to get the last item of a collection
|
6
|
+
class Last
|
7
|
+
acts_as_hashable
|
8
|
+
|
9
|
+
def transform(resolver, value, time, record)
|
10
|
+
AtIndex.new(index: -1).transform(resolver, value, time, record)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -1,16 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative 'sort/direction'
|
4
|
+
|
3
5
|
module Realize
|
4
6
|
class Collection
|
5
|
-
# Transformer to take an array of
|
7
|
+
# Transformer to take an array of objects and sort by the given key
|
6
8
|
# and by the given sort direction. Defaulting to ascending.
|
7
9
|
class Sort
|
8
|
-
module Direction
|
9
|
-
ASCENDING = 'ASC'
|
10
|
-
ASC = 'ASC'
|
11
|
-
DESCENDING = 'DESC'
|
12
|
-
DESC = 'DESC'
|
13
|
-
end
|
14
10
|
include Arrays
|
15
11
|
include Direction
|
16
12
|
acts_as_hashable
|
@@ -1,35 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative 'sort/direction'
|
4
|
-
|
5
3
|
module Realize
|
6
4
|
class Collection
|
7
|
-
# Transformer to take an array of oibjects and sort by the given key
|
8
|
-
# and by the given sort direction. Defaulting to ascending.
|
9
5
|
class Sort
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
attr_reader :key, :order
|
17
|
-
|
18
|
-
def initialize(key:, order: DEFAULT_ORDER)
|
19
|
-
raise ArgumentError, 'key is required' if key.to_s.empty?
|
20
|
-
|
21
|
-
@key = key
|
22
|
-
@order = Direction.const_get(order.to_s.upcase.to_sym)
|
23
|
-
|
24
|
-
freeze
|
25
|
-
end
|
26
|
-
|
27
|
-
def transform(_resolver, value, _time, _record)
|
28
|
-
records = array(value)
|
29
|
-
|
30
|
-
sorted = records.sort_by { |hsh| hsh[key.to_sym] }
|
31
|
-
|
32
|
-
order == DESCENDING ? sorted.reverse : sorted
|
6
|
+
# Constants describing the possible values of 'direction' for a Sort instance.
|
7
|
+
module Direction
|
8
|
+
# providing a few different ways to specify.
|
9
|
+
ASCENDING = ASC = 'ASC'
|
10
|
+
DESCENDING = DESC = 'DESC'
|
33
11
|
end
|
34
12
|
end
|
35
13
|
end
|
data/lib/realize/format/date.rb
CHANGED
@@ -30,12 +30,10 @@ module Realize
|
|
30
30
|
return nil if value.to_s.empty?
|
31
31
|
|
32
32
|
date_time =
|
33
|
-
if
|
34
|
-
value.to_datetime
|
35
|
-
elsif input_format?
|
33
|
+
if input_format?
|
36
34
|
DateTime.strptime(value, input_format)
|
37
35
|
else
|
38
|
-
DateTime.parse(value)
|
36
|
+
DateTime.parse(value.to_s)
|
39
37
|
end
|
40
38
|
|
41
39
|
date_time.strftime(output_format)
|
data/lib/realize/transformers.rb
CHANGED
@@ -1,19 +1,31 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative 'collection/at_index'
|
4
|
+
require_relative 'collection/first'
|
5
|
+
require_relative 'collection/last'
|
3
6
|
require_relative 'collection/sort'
|
7
|
+
|
4
8
|
require_relative 'filter/by_key_record_value'
|
5
9
|
require_relative 'filter/by_key_value'
|
6
10
|
require_relative 'filter/by_key_value_presence'
|
7
11
|
require_relative 'filter/inactive'
|
12
|
+
|
8
13
|
require_relative 'format/date'
|
9
14
|
require_relative 'format/remove_whitespace'
|
10
15
|
require_relative 'format/string_replace'
|
16
|
+
|
11
17
|
require_relative 'logical/switch'
|
18
|
+
|
19
|
+
require_relative 'type/boolean'
|
20
|
+
require_relative 'type/string'
|
21
|
+
|
12
22
|
require_relative 'value/blank'
|
13
23
|
require_relative 'value/map'
|
24
|
+
require_relative 'value/now'
|
14
25
|
require_relative 'value/null'
|
15
26
|
require_relative 'value/resolve'
|
16
27
|
require_relative 'value/static'
|
28
|
+
require_relative 'value/uuid'
|
17
29
|
require_relative 'value/verbatim'
|
18
30
|
|
19
31
|
module Realize
|
@@ -24,21 +36,32 @@ module Realize
|
|
24
36
|
class Transformers
|
25
37
|
acts_as_hashable_factory
|
26
38
|
|
27
|
-
register '',
|
39
|
+
register 'r/collection/at_index', Collection::AtIndex
|
40
|
+
register 'r/collection/first', Collection::First
|
41
|
+
register 'r/collection/last', Collection::Last
|
28
42
|
register 'r/collection/sort', Collection::Sort
|
43
|
+
|
29
44
|
register 'r/filter/by_key_record_value', Filter::ByKeyRecordValue
|
30
45
|
register 'r/filter/by_key_value', Filter::ByKeyValue
|
31
46
|
register 'r/filter/by_key_value_presence', Filter::ByKeyValuePresence
|
32
47
|
register 'r/filter/inactive', Filter::Inactive
|
48
|
+
|
33
49
|
register 'r/format/date', Format::Date
|
34
50
|
register 'r/format/remove_whitespace', Format::RemoveWhitespace
|
35
51
|
register 'r/format/string_replace', Format::StringReplace
|
52
|
+
|
36
53
|
register 'r/logical/switch', Logical::Switch
|
54
|
+
|
55
|
+
register 'r/type/boolean', Type::Boolean
|
56
|
+
register 'r/type/string', Type::String
|
57
|
+
|
37
58
|
register 'r/value/blank', Value::Blank
|
38
59
|
register 'r/value/map', Value::Map
|
60
|
+
register 'r/value/now', Value::Now
|
39
61
|
register 'r/value/null', Value::Null
|
40
62
|
register 'r/value/resolve', Value::Resolve
|
41
63
|
register 'r/value/static', Value::Static
|
42
|
-
register 'r/value/
|
64
|
+
register 'r/value/uuid', Value::Uuid
|
65
|
+
register 'r/value/verbatim', '', Value::Verbatim
|
43
66
|
end
|
44
67
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Realize
|
4
|
+
class Type
|
5
|
+
# Convert input into either true, false, or nil.
|
6
|
+
# By default nils will return false unless nullable: true is passed in.
|
7
|
+
# This transformer is very liberal in its parsing and will return true for:
|
8
|
+
# true, 'true', 't', 'TRUE', 'True', 1, '1', 'Y', 'yes', 'Yes', 'YES'
|
9
|
+
# All over non-truthy values will evaluate to false, such as:
|
10
|
+
# false: false, 'false', 'f', 'FALSE', 'False', 0, '0', 'N', 'no', 'No', 'NO', {}, [], ''
|
11
|
+
class Boolean
|
12
|
+
acts_as_hashable
|
13
|
+
|
14
|
+
attr_reader :nullable
|
15
|
+
|
16
|
+
def initialize(nullable: false)
|
17
|
+
@nullable = nullable || false
|
18
|
+
end
|
19
|
+
|
20
|
+
def transform(_resolver, value, _time, _record)
|
21
|
+
if nullable && value.nil?
|
22
|
+
nil
|
23
|
+
elsif truthy?(value)
|
24
|
+
true
|
25
|
+
else
|
26
|
+
false
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def truthy?(value)
|
33
|
+
value.to_s.match?(/(true|t|yes|y|1)$/i)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Realize
|
4
|
+
class Type
|
5
|
+
# Call #to_s on the value and return result.
|
6
|
+
class String
|
7
|
+
acts_as_hashable
|
8
|
+
|
9
|
+
attr_reader :nullable
|
10
|
+
|
11
|
+
def initialize(nullable: false)
|
12
|
+
@nullable = nullable || false
|
13
|
+
end
|
14
|
+
|
15
|
+
def transform(_resolver, value, _time, _record)
|
16
|
+
return nil if nullable && value.nil?
|
17
|
+
|
18
|
+
value.to_s
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Realize
|
4
|
+
class Value
|
5
|
+
# Return a current Time object.
|
6
|
+
class Now
|
7
|
+
acts_as_hashable
|
8
|
+
|
9
|
+
DEFAULT_UTC_OFFSET = '+00:00'
|
10
|
+
|
11
|
+
attr_reader :utc_offset
|
12
|
+
|
13
|
+
def initialize(utc_offset: DEFAULT_UTC_OFFSET)
|
14
|
+
@utc_offset = utc_offset || DEFAULT_UTC_OFFSET
|
15
|
+
|
16
|
+
freeze
|
17
|
+
end
|
18
|
+
|
19
|
+
def transform(_resolver, _value, _time, _record)
|
20
|
+
Time.now.utc.localtime(utc_offset)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/realize/version.rb
CHANGED
data/realize.gemspec
CHANGED
@@ -11,8 +11,8 @@ Gem::Specification.new do |s|
|
|
11
11
|
Derive and transform a value using a configuration-first pipeline.
|
12
12
|
DESCRIPTION
|
13
13
|
|
14
|
-
s.authors = ['Matthew Ruggio']
|
15
|
-
s.email = ['mruggio@bluemarblepayroll.com']
|
14
|
+
s.authors = ['Matthew Ruggio', 'Dan Dewar']
|
15
|
+
s.email = ['mruggio@bluemarblepayroll.com', 'ddewar@bluemarblepayroll.com']
|
16
16
|
s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
17
17
|
s.bindir = 'exe'
|
18
18
|
s.executables = []
|
@@ -28,7 +28,7 @@ Gem::Specification.new do |s|
|
|
28
28
|
|
29
29
|
s.required_ruby_version = '>= 2.5'
|
30
30
|
|
31
|
-
s.add_dependency('acts_as_hashable', '
|
31
|
+
s.add_dependency('acts_as_hashable', '~>1', '>=1.2.0')
|
32
32
|
s.add_dependency('objectable', '~>1')
|
33
33
|
|
34
34
|
s.add_development_dependency('guard-rspec', '~>4.7')
|
metadata
CHANGED
@@ -1,29 +1,36 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: realize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0.pre.alpha
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew Ruggio
|
8
|
+
- Dan Dewar
|
8
9
|
autorequire:
|
9
10
|
bindir: exe
|
10
11
|
cert_chain: []
|
11
|
-
date: 2020-
|
12
|
+
date: 2020-10-02 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: acts_as_hashable
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
16
17
|
requirements:
|
17
|
-
- -
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '1'
|
21
|
+
- - ">="
|
18
22
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.2.0
|
23
|
+
version: 1.2.0
|
20
24
|
type: :runtime
|
21
25
|
prerelease: false
|
22
26
|
version_requirements: !ruby/object:Gem::Requirement
|
23
27
|
requirements:
|
24
|
-
- -
|
28
|
+
- - "~>"
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '1'
|
31
|
+
- - ">="
|
25
32
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.2.0
|
33
|
+
version: 1.2.0
|
27
34
|
- !ruby/object:Gem::Dependency
|
28
35
|
name: objectable
|
29
36
|
requirement: !ruby/object:Gem::Requirement
|
@@ -139,6 +146,7 @@ dependencies:
|
|
139
146
|
description: " Derive and transform a value using a configuration-first pipeline.\n"
|
140
147
|
email:
|
141
148
|
- mruggio@bluemarblepayroll.com
|
149
|
+
- ddewar@bluemarblepayroll.com
|
142
150
|
executables: []
|
143
151
|
extensions: []
|
144
152
|
extra_rdoc_files: []
|
@@ -159,6 +167,9 @@ files:
|
|
159
167
|
- exe/.gitkeep
|
160
168
|
- lib/realize.rb
|
161
169
|
- lib/realize/arrays.rb
|
170
|
+
- lib/realize/collection/at_index.rb
|
171
|
+
- lib/realize/collection/first.rb
|
172
|
+
- lib/realize/collection/last.rb
|
162
173
|
- lib/realize/collection/sort.rb
|
163
174
|
- lib/realize/collection/sort/direction.rb
|
164
175
|
- lib/realize/filter/by_key_record_value.rb
|
@@ -172,11 +183,15 @@ files:
|
|
172
183
|
- lib/realize/logical/switch/case.rb
|
173
184
|
- lib/realize/pipeline.rb
|
174
185
|
- lib/realize/transformers.rb
|
186
|
+
- lib/realize/type/boolean.rb
|
187
|
+
- lib/realize/type/string.rb
|
175
188
|
- lib/realize/value/blank.rb
|
176
189
|
- lib/realize/value/map.rb
|
190
|
+
- lib/realize/value/now.rb
|
177
191
|
- lib/realize/value/null.rb
|
178
192
|
- lib/realize/value/resolve.rb
|
179
193
|
- lib/realize/value/static.rb
|
194
|
+
- lib/realize/value/uuid.rb
|
180
195
|
- lib/realize/value/verbatim.rb
|
181
196
|
- lib/realize/version.rb
|
182
197
|
- realize.gemspec
|