text-interpolator 1.1.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
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