text-interpolator 1.1.0 → 1.1.1

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,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MGI1Y2YyNjFlYzEwZDEzNTJiMDhjNDNiNGJjNzBkYjI5N2M3OGVjYQ==
4
+ ODFiMjU4MGFiYTgyMTJjMDg1ODAwODZkODk0OTU1YjkyMzBhMTI4NA==
5
5
  data.tar.gz: !binary |-
6
- YzgyYzU5Zjc4MDQzZWFkZjBkYTUxZGNmZTExZmM5YjU2MjJjOGE3Mw==
6
+ ZjZkNzBiYmYxNThmNDU3ZGFjNjg5MTA1NjIzMTA4N2FkYjM5MTI0NQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MzU2YjQ5MGQ2YWY4MWU2NTY3ZDg4ZWM4OTQ3MjUwZGRhMDc4ODE2ZGQwZGQ0
10
- YzY0Y2ZmNTc0ZmU4YTg1MjI2NzhmOTMyMDFkM2QyZDE5YTYyZGI2YWE5ZmQz
11
- NmQ2ZmVhOTQwMGU4NjE3NzIxZmIzYTNjYzc1MTE2N2E3ODY1N2Q=
9
+ YTM4OTRmYjMwMDE5ODc5NTIyZDA2Y2UzOTdiM2RhY2EzNzExZDg2OWJjYzkz
10
+ YmY3YjlmMGRhODM3MGEyYmJlODAxMWJiMmEyMjE2YjMzMDRkYzMyZTljMDk5
11
+ OGFkMGU2ZmE3NWQwNzRmZWZjNmEyMDM2ZTUxZmUzYzYwODMzYWQ=
12
12
  data.tar.gz: !binary |-
13
- ZGU0YzEyNTFhNmJmMzQxYWI0NTUzZmI1MzA0ZWJlOGZhMjBjNGMxOWE3MTBm
14
- ODA1MDE0ZDI1ZTU0MGVkMTM2OGU3YmE4ZjE1NmEwOGFkYjkxMmI3NzQ0NDMy
15
- YjQ0N2U2MjIzYzM2ZmI1ZGQ2ZjZkOGViOTFlOTQyMzNkNjdiOWQ=
13
+ Nzk5Yzc1Y2IyZTYwMzRlMjVmYzNhOWUxMTdkMTMwNjcyNmRiM2U1NDdiNjNh
14
+ NDQxYmM1YmJmNDkwN2RjZTMzNjAxYWQ4ODIzNTZmYTAxYjk2MDUyZTIxYWFl
15
+ OTg2NmM0ZTNmOTZiOTdiZGExYWE5MTU2MDcxMTE1ZTQ3ZGZkZDc=
data/CHANGES CHANGED
@@ -26,4 +26,8 @@
26
26
 
27
27
  == Version 1.1.0
28
28
 
29
- * Adding qualified variable names.
29
+ * Adding qualified variable names.
30
+
31
+ == Version 1.1.1
32
+
33
+ * Bug fix.
@@ -1,5 +1,4 @@
1
1
  require 'stringio'
2
- require 'text_interpolator/hash_processor'
3
2
 
4
3
  class TextInterpolator
5
4
 
@@ -8,20 +7,37 @@ class TextInterpolator
8
7
  def interpolate object, env={}
9
8
  if object.kind_of? String
10
9
  interpolate_string object, env
11
- elsif object.kind_of? IO
12
- interpolate_io object, env
13
10
  elsif object.kind_of? Hash
14
11
  interpolate_hash object
12
+ elsif object.kind_of? IO
13
+ interpolate_io object, env
15
14
  else
16
15
  object
17
16
  end
18
17
  end
19
18
 
20
19
  def interpolate_string string, env={}
21
- string = interpolate_env_vars string
22
- string = string.gsub(/\#{/, '%{') if string.index(/\#\{/)
20
+ @errors = {}
21
+
22
+ value = interpolate_system_variable string
23
+
24
+ begin
25
+ new_value = interpolate_variable value, env
26
+ rescue KeyError => e
27
+ errors << e.message
28
+ end
29
+
30
+ new_value
31
+ end
32
+
33
+ def interpolate_hash hash
34
+ @errors = {}
35
+
36
+ content = interpolate_system_variables(hash)
37
+
38
+ var_table = build_variables_table(content) # one-dimensional collection of variables
23
39
 
24
- StringIO.new(string).read % env
40
+ interpolate_variables(content, var_table)
25
41
  end
26
42
 
27
43
  def interpolate_io io, env={}
@@ -35,10 +51,115 @@ class TextInterpolator
35
51
  result
36
52
  end
37
53
 
38
- def interpolate_hash hash
39
- result, @errors = *HashProcessor.instance.process(hash)
54
+ private
40
55
 
41
- result
56
+ def interpolate_system_variables hash
57
+ content = {}
58
+
59
+ hash.each do |key, value|
60
+ if value.kind_of? String
61
+ new_value = interpolate_system_variable value
62
+
63
+ content[key] = new_value if new_value
64
+ elsif value.kind_of? Hash
65
+ content[key] = interpolate_system_variables value
66
+ else
67
+ content[key] = value
68
+ end
69
+ end
70
+
71
+ content
72
+ end
73
+
74
+ def interpolate_system_variable value
75
+ new_value = value
76
+
77
+ while new_value.index('ENV[')
78
+ index1 = new_value.index("ENV[")
79
+ index2 = new_value.index("]")
80
+
81
+ name = new_value[index1+5..index2-2]
82
+
83
+ left = (index1 == 0) ? '' : new_value[0..index1-1]
84
+ right = new_value[index2+1..-1]
85
+
86
+ new_value = left + ENV[name] + right
87
+ end
88
+
89
+ new_value
90
+ end
91
+
92
+ def build_variables_table content
93
+ var_table = {}
94
+
95
+ content.each do |key, value|
96
+ build_variable(var_table, key, key, value)
97
+ end
98
+
99
+ var_table
100
+ end
101
+
102
+ def build_variable(var_table, compound_key, key, value)
103
+ if value.kind_of? String
104
+ var_table[key] = interpolate_variable value, var_table
105
+ elsif value.kind_of? Hash
106
+ build_hash var_table, compound_key, value
107
+ end
108
+ end
109
+
110
+ def build_hash var_table, compound_key, hash
111
+ hash.each do |key, value|
112
+ new_compound_key = "#{compound_key}.#{key}"
113
+
114
+ if value.kind_of? Hash
115
+ build_variable(var_table, new_compound_key, key, value)
116
+ else
117
+ var_table[new_compound_key.to_sym] = value
118
+ end
119
+ end
120
+ end
121
+
122
+ def interpolate_variables content, env
123
+ hash = {}
124
+
125
+ begin
126
+ substitutions = false
127
+
128
+ content.each do |key, value|
129
+ new_value = value
130
+ substitutions = false
131
+
132
+ if value.kind_of? String
133
+ if value.index(/\#\{/)
134
+ substitutions = true
135
+
136
+ begin
137
+ new_value = interpolate_variable value, env
138
+ rescue KeyError => e
139
+ substitutions = false
140
+
141
+ errors << e.message
142
+ end
143
+ end
144
+ elsif value.kind_of? Hash
145
+ new_value = interpolate_variables value, env
146
+ end
147
+
148
+ if hash[key] == new_value
149
+ substitutions = false
150
+ else
151
+ hash[key] = new_value
152
+ end
153
+ end
154
+ end while substitutions
155
+
156
+ hash
157
+ end
158
+
159
+ def interpolate_variable value, env
160
+ new_value = value.index(/\#\{/) ? value.gsub(/\#{/, '%{') : value
161
+
162
+ StringIO.new(new_value).read % env
42
163
  end
43
164
 
44
165
  end
@@ -1,3 +1,3 @@
1
1
  class TextInterpolator
2
- VERSION = "1.1.0"
2
+ VERSION = "1.1.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: text-interpolator
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Shvets
@@ -54,7 +54,6 @@ files:
54
54
  - README.md
55
55
  - Rakefile
56
56
  - lib/text_interpolator.rb
57
- - lib/text_interpolator/hash_processor.rb
58
57
  - lib/text_interpolator/text_interpolator.rb
59
58
  - lib/text_interpolator/version.rb
60
59
  - spec/spec_helper.rb
@@ -1,125 +0,0 @@
1
- require 'singleton'
2
-
3
- class HashProcessor
4
- include Singleton
5
-
6
- def process hash
7
- errors = {}
8
-
9
- content = interpolate_system_variables(hash)
10
-
11
- var_table = build_variables_table(content) # one-dimensional collection of variables
12
-
13
- result = interpolate_variables(content, var_table, errors)
14
-
15
- [result, errors]
16
- end
17
-
18
- private
19
-
20
- def interpolate_system_variables hash
21
- content = {}
22
-
23
- hash.each do |key, value|
24
- if value.kind_of? String
25
- new_value = interpolate_system_variable value
26
-
27
- content[key] = new_value if new_value
28
- elsif value.kind_of? Hash
29
- content[key] = interpolate_system_variables value
30
- else
31
- content[key] = value
32
- end
33
- end
34
-
35
- content
36
- end
37
-
38
- def interpolate_system_variable value
39
- new_value = value
40
-
41
- while new_value.index('ENV[')
42
- index1 = new_value.index("ENV[")
43
- index2 = new_value.index("]")
44
-
45
- name = new_value[index1+5..index2-2]
46
-
47
- left = (index1 == 0) ? '' : new_value[0..index1-1]
48
- right = new_value[index2+1..-1]
49
-
50
- new_value = left + ENV[name] + right
51
- end
52
-
53
- new_value
54
- end
55
-
56
- def build_variables_table content
57
- var_table = {}
58
-
59
- content.each do |key, value|
60
- build_variable(var_table, key, key, value)
61
- end
62
-
63
- var_table
64
- end
65
-
66
- def build_variable(var_table, compound_key, key, value)
67
- if value.kind_of? String
68
- var_table[key] = value
69
- elsif value.kind_of? Hash
70
- build_hash var_table, compound_key, value
71
- end
72
- end
73
-
74
- def build_hash var_table, compound_key, hash
75
- hash.each do |key, value|
76
- new_compound_key = "#{compound_key}.#{key}"
77
-
78
- if value.kind_of? Hash
79
- build_variable(var_table, new_compound_key, key, value)
80
- else
81
- var_table[new_compound_key.to_sym] = value
82
- end
83
- end
84
- end
85
-
86
- def interpolate_variables content, env, errors
87
- hash = {}
88
-
89
- begin
90
- substitutions = false
91
-
92
- content.each do |key, value|
93
- new_value = value
94
- substitutions = false
95
-
96
- if value.kind_of? String
97
- if value.index(/\#\{/)
98
- substitutions = true
99
-
100
- new_value = value.gsub(/\#{/, '%{')
101
-
102
- begin
103
- new_value = StringIO.new(new_value).read % env
104
- rescue KeyError => e
105
- substitutions = false
106
-
107
- errors << e.message
108
- end
109
- end
110
- elsif value.kind_of? Hash
111
- new_value = interpolate_variables value, env, errors
112
- end
113
-
114
- if hash[key] == new_value
115
- substitutions = false
116
- else
117
- hash[key] = new_value
118
- end
119
- end
120
- end while substitutions
121
-
122
- hash
123
- end
124
-
125
- end