nay 0.0.2 → 0.0.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e7aa4e8a6e59c35d02dac84443aa109593f4c16ea23298d3bbbcd4e0c7c7baf5
4
- data.tar.gz: ee9d6518d6597bc1a68ef2d3a4261ced357b86a32b0482565dd44ca811dea2d4
3
+ metadata.gz: b57f5f0b2fa5d4029a0929787441104e328b7d3a2a90a10ad31d916dc240980c
4
+ data.tar.gz: 3304ea0e737b31138c7962e0279ba0ffc648c5ef5a4f5ceb24a73c8f7a3d2314
5
5
  SHA512:
6
- metadata.gz: e79219112b550df70baa420a7070ee3cc2766b906e535fdf6d8f84e10451f65173e8624b0a71778d4d80acef017ef2b588a3e21993826933ba000266ef18319f
7
- data.tar.gz: 778e6dd6a679833a2cdeefb327f5d84f2aacabf74aee750085e02c318dc8781369281dbcdd1a155f30e5a0ba228f5d91ce953cd17f6113b8ba47af07631945dc
6
+ metadata.gz: 07a0c0cfde1458fe322091287277128757514a581c0fabc9cc782efe38d6a23572bd9e1d43f88e96c8c7fbba6a6fd052ac7cda7c840a77e13f0f5f1598d23684
7
+ data.tar.gz: 8924a857891e42d710de59cafbd54247f46e018f02195e9d762cec56893d53ed3015ed31658f5eeeba32eba3f48e0e22fee2bd4120596fe2ab1026479ac18457
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ #### 0.0.3 - February 18th, 2022
2
+
3
+ * Works with not just string expressions but with also hash and arrays.
4
+ #### 0.0.2 - February 18th, 2022
5
+
6
+ * Add underscore and hyphen to list of acceptable tokens without qualifying.
7
+
1
8
  #### 0.0.1 - February 17th, 2022
2
9
 
3
10
  * Initial version.
data/README.md CHANGED
@@ -22,6 +22,8 @@ bundle add nay
22
22
 
23
23
  ## Examples
24
24
 
25
+ ### Simple String-based Expression
26
+
25
27
  ````ruby
26
28
  animal = {
27
29
  'animal' => {
@@ -41,6 +43,59 @@ Notes:
41
43
  * Tokens are passed through #[] method for the passed in object. Any object providing a brackets interface will work.
42
44
  * A valid token only contains the following characters: [a-zA-Z0-9_-]. If a token needs to contain something not in that list then qualify it with double quotes (i.e. `hello, << person."first name" >>`)
43
45
 
46
+ ### More Complex Expressions
47
+
48
+ Expressions are not limited to just being a string. Here are the basic heuristics:
49
+
50
+ * hash: then each key and value are recursively traversed
51
+ * array: then each entry is recursively traversed
52
+ * string: evaluated with parameters
53
+ * anything not a hash, array, or string: do nothing
54
+
55
+ An example of this would be a somewhat complicated object:
56
+
57
+ ````ruby
58
+ object = {
59
+ '<< id_key >>' => '<< id >>',
60
+ 'pets' => [
61
+ '<< pets."pet 1" >>',
62
+ '<< pets."pet 2" >>'
63
+ ],
64
+ zyx: :vut
65
+ }
66
+
67
+ parameters = {
68
+ 'id_key' => 'id',
69
+ 'id' => 123,
70
+ 'pets' => {
71
+ 'pet 1' => 'dog',
72
+ 'pet 2' => 'cat'
73
+ },
74
+ zyx: :vut
75
+ }
76
+
77
+ evaluated_object = Nay.evaluate(object, parameters)
78
+ ````
79
+
80
+ In the above example evaluated_object would be equivalent to:
81
+
82
+ ````ruby
83
+ {
84
+ 'id' => '123',
85
+ 'pets' => [
86
+ 'dog',
87
+ 'cat'
88
+ ],
89
+ zyx: :vut
90
+ }
91
+ ````
92
+
93
+ Notes:
94
+
95
+ * A hash, hash key, and hash value are represented here
96
+ * An array with entries are represented here
97
+ * A non-string is represented here (as the zyx/vut key/value)
98
+
44
99
  ## Contributing
45
100
 
46
101
  ### Development Environment Configuration
data/lib/nay/evaluator.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Nay
4
- # Knows how to take a stream of lexically analyzed tokens along with an input hash and
4
+ # Knows how to take a stream of lexically analyzed tokens along with a parameters hash and
5
5
  # evaluate interpolated key paths.
6
6
  class Evaluator
7
7
  attr_reader :lexer
@@ -10,16 +10,16 @@ module Nay
10
10
  @lexer = lexer
11
11
  end
12
12
 
13
- def evaluate(input = {})
13
+ def evaluate(parameters = {})
14
14
  io = StringIO.new
15
- pointer = input
15
+ pointer = parameters
16
16
 
17
17
  while (token = lexer.next_token)
18
18
  case token.type
19
19
  when Lexer::CONTENT
20
20
  io << token.literal
21
21
  when Lexer::OPEN_EXPRESSION
22
- pointer = input
22
+ pointer = parameters
23
23
  when Lexer::IDENTIFIER
24
24
  pointer = traverse(pointer, token.literal)
25
25
  when Lexer::CLOSE_EXPRESSION
@@ -32,8 +32,8 @@ module Nay
32
32
 
33
33
  private
34
34
 
35
- def traverse(input, value)
36
- input[value] if input.respond_to?(:[])
35
+ def traverse(parameters, value)
36
+ parameters[value] if parameters.respond_to?(:[])
37
37
  end
38
38
  end
39
39
  end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'evaluator'
4
+ require_relative 'lexer'
5
+
6
+ module Nay
7
+ # Built on top of the string-based Lexer/Evaluator but instead of only working for a string,
8
+ # this will recursively evaluate all strings within an object. Heuristics:
9
+ # - Hashes will have their keys and parameters traversed
10
+ # - Arrays will have their entries traversed
11
+ # - Strings evaluate using Lexer
12
+ # - All other types will simply return themselves (not be traversed or use the Lexer)
13
+ class Template
14
+ attr_reader :object
15
+
16
+ def initialize(object)
17
+ @object = object
18
+
19
+ freeze
20
+ end
21
+
22
+ def evaluate(parameters = {})
23
+ recursive_evaluate(object, parameters)
24
+ end
25
+
26
+ private
27
+
28
+ def recursive_evaluate(expression, parameters)
29
+ case expression
30
+ when Array
31
+ expression.map { |o| recursive_evaluate(o, parameters) }
32
+ when Hash
33
+ expression.to_h do |k, v|
34
+ [recursive_evaluate(k, parameters), recursive_evaluate(v, parameters)]
35
+ end
36
+ when String
37
+ Evaluator.new(Lexer.new(expression)).evaluate(parameters)
38
+ else
39
+ expression
40
+ end
41
+ end
42
+ end
43
+ end
data/lib/nay/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Nay
4
- VERSION = '0.0.2'
4
+ VERSION = '0.0.3'
5
5
  end
data/lib/nay.rb CHANGED
@@ -3,17 +3,13 @@
3
3
  require 'stringio'
4
4
  require 'strscan'
5
5
 
6
- require_relative 'nay/evaluator'
7
- require_relative 'nay/lexer'
6
+ require_relative 'nay/template'
8
7
 
9
8
  # Top-level API
10
9
  module Nay
11
10
  class << self
12
- def evaluate(string = '', input = {})
13
- lexer = Lexer.new(string)
14
- evaluator = Evaluator.new(lexer)
15
-
16
- evaluator.evaluate(input)
11
+ def evaluate(object, parameters = {})
12
+ Template.new(object).evaluate(parameters)
17
13
  end
18
14
  end
19
15
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nay
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Ruggio
@@ -188,6 +188,7 @@ files:
188
188
  - lib/nay/evaluator.rb
189
189
  - lib/nay/lexer.rb
190
190
  - lib/nay/state.rb
191
+ - lib/nay/template.rb
191
192
  - lib/nay/token.rb
192
193
  - lib/nay/version.rb
193
194
  - nay.gemspec