realize 1.0.0.pre.alpha.3 → 1.2.0.pre.alpha

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: eb3e9cd917389279276aa968f492756ea7b4db901cdfd2a1065f55312c257874
4
- data.tar.gz: 17748da9bb8c6e502d48d095ec44482010b4715b5afeb225c00d53022c1c33d5
3
+ metadata.gz: 1a4e738840e298580fc77dfc5ace2d254b63373929c0b09b24783b3b3c639027
4
+ data.tar.gz: 64a75dcfb103323c9a5bedaad2ba16c9195e18410e860ca8c6a144329cdb488a
5
5
  SHA512:
6
- metadata.gz: cf522c8f60b1d78a31469a8dac3518de16d654e8da4ce59553fb998a9d3aec2739a1caf39b94fbd996a308721c90204b0bacbf11f7f765e7e4dbea1d8bd9af31
7
- data.tar.gz: 537e1cd2b918b041079227025287551dbf2d006b950a1fee5471c4f0b65a7ee49a5d88b663355cbc026aa5c89c99e7a94279669d48767198bfa13d1ac8ffcfd3
6
+ metadata.gz: 57679313d416e0e331c563ef6b756bda9c77a22338812d435f563bf5cbe399e81ace68e183a4c4e897c4bbe719fd3b942fa2cde5bfeabe1dd536416ad9858a57
7
+ data.tar.gz: 2e3bddcec287597fa11b600488a088ca6f87ea9de75b985e656632f7d87e68c5fcd1de54eaf16d106ed2fbf2b5d1d00550abd1710df557def1c5ab54d376cf20
@@ -1,3 +1,22 @@
1
- # 1.0.0 (June 8th, 2020)
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/logical/blank** []: Always return a blank string.
87
- * **r/logical/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.
88
- * **r/logical/null** []: Always returns null.
89
- * **r/logical/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.)
90
- * **r/logical/static** [value]: Always returns a hard-coded value.
91
- * **r/logical/verbatim** []: Default transformer, simply echos back the input.
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
 
@@ -9,6 +9,7 @@
9
9
 
10
10
  require 'acts_as_hashable'
11
11
  require 'objectable'
12
+ require 'securerandom'
12
13
  require 'time'
13
14
 
14
15
  require_relative 'realize/arrays'
@@ -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 oibjects and sort by the given key
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
- include Arrays
11
- include Direction
12
- acts_as_hashable
13
-
14
- DEFAULT_ORDER = ASCENDING
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
@@ -30,12 +30,10 @@ module Realize
30
30
  return nil if value.to_s.empty?
31
31
 
32
32
  date_time =
33
- if value.respond_to?(:to_datetime)
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)
@@ -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 '', Value::Verbatim
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/verbatim', Value::Verbatim
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
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Realize
4
+ class Value
5
+ # Return a current Time object.
6
+ class Uuid
7
+ acts_as_hashable
8
+
9
+ def transform(_resolver, _value, _time, _record)
10
+ SecureRandom.uuid
11
+ end
12
+ end
13
+ end
14
+ end
@@ -8,5 +8,5 @@
8
8
  #
9
9
 
10
10
  module Realize
11
- VERSION = '1.0.0-alpha.3'
11
+ VERSION = '1.2.0-alpha'
12
12
  end
@@ -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', '=1.2.0.pre.alpha.1')
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.0.0.pre.alpha.3
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-06-09 00:00:00.000000000 Z
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.pre.alpha.1
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.pre.alpha.1
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