kube-config-parser 0.0.4 → 1.0.0

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
  SHA1:
3
- metadata.gz: 84b5c93956801a3bd81dc17afa74621218b90f94
4
- data.tar.gz: 871d57b9aaff2baa7be01c8203af1ad2fdbae090
3
+ metadata.gz: 9c8dcb06918e59549d84796e1574254de4e0e2cf
4
+ data.tar.gz: 23649ff20456176905ca92ab0265d603451eb9d0
5
5
  SHA512:
6
- metadata.gz: 7c5b4612ec20c67a1daffb23b6dfe6829fd6dba18c8e03f4f7d7d932837f3527b72566ac717cebaaa2653d693c7ecf85888018941d3802d84cd3260552a10e77
7
- data.tar.gz: b92497c81cf9f90b3dc7518ccb79ff16272d4493bd2719663b1341656248b943f310d47dcc8d44e59f27807de7a50dc2cd0585879d071ff7cd4075573edc3d93
6
+ metadata.gz: 9362cd8199e860c6729f1308560912607abc91ce6cdf450d36b1f512a20bc7d54e01209515e3a5ccb8940eb2c0a53b5afe3a5d5a83ce34609f7e03772810b04b
7
+ data.tar.gz: 0b1d6b7cadbe0797e447ad3ab762dd9f4431f7408b308a085df8dfc29dddace25171096d415c1bbce50760870e3d34fa8b6e59ad34af68b65f639671c77e5f85
@@ -0,0 +1,9 @@
1
+ require 'ostruct'
2
+
3
+ class OpenStruct
4
+ def self.to_os(hash)
5
+ OpenStruct.new(hash.each_with_object({}) do |(key, val), memo|
6
+ memo[key] = val.is_a?(Hash) ? to_os(val) : val
7
+ end)
8
+ end
9
+ end
@@ -1,168 +1,23 @@
1
1
  require 'yaml'
2
2
 
3
- module ::YAML
4
- def self.kube_load(all_str)
5
- all_str.split("---\n").reject(&:empty?).map do |paragraph|
6
- YAML.load(paragraph)
7
- end
8
- end
9
- end
3
+ require_relative 'kube_config_parser/paragraph'
10
4
 
11
5
  module ParserModule
12
- class SimpleHash
13
- def initialize(hash)
14
- @hash = hash
15
- end
16
-
17
- def method_missing(method_name_sym)
18
- result = @hash[method_name_sym.to_s] || @hash[method_name_sym]
19
- return nil if result.nil?
20
- SimpleHash.new(result)
21
- end
22
-
23
- def inspect
24
- @hash.inspect
25
- end
26
-
27
- def to_s
28
- @hash.to_s
29
- end
30
- end
31
-
32
- class EnvParser
33
-
34
-
35
- False = false
36
- True = true
37
-
38
- def initialize(input_table, ifelse_stack)
39
- @input_table = input_table
40
- @variable_table = {}
41
- @ifelse_stack = ifelse_stack
42
- end
43
-
44
- def ifelse_stack
45
- @ifelse_stack
46
- end
47
-
48
- def update(line)
49
- command = line.gsub(/\s?\|\s?/, ' || ').gsub(/set (.*?) =/, 'set[\'\1\'] =')
50
- eval(command)
51
- end
52
-
53
- def set
54
- @variable_table
55
- end
56
-
57
- def item
58
- return SimpleHash.new(@input_table)
59
- end
60
-
61
- def default(value_str)
62
- value_str
63
- end
64
-
65
- def method_missing(method_name_sym)
66
- @variable_table[method_name_sym.to_s] || @variable_table[method_name_sym]
67
- end
68
-
69
- def echo(str)
70
- command = '"' + str + '"'
71
- #puts command
72
- eval(command)
73
- end
74
-
75
- end
76
-
77
- class IfElseStack
78
- def initialize
79
- @seq = []
80
- end
81
-
82
- def push(condition, str)
83
- @seq.push([condition, str])
84
- end
85
-
86
- def top
87
- condition, str = @seq.delete_at(0)
88
- is_ruby_value = str.match(/#\{(.*?)\}/)
89
- if is_ruby_value
90
- value = @env_parser.instance_eval(is_ruby_value[1])
91
- str = str.gsub(/#\{(.*?)\}/, value.to_s)
92
- end
93
- @env_parser.instance_eval(condition) ? str : nil
94
- end
95
-
96
- def set_env_parser(env_parser)
97
- @env_parser = env_parser
98
- end
99
-
100
- end
101
-
102
- class RubyStrParser
103
- def self.parse(str)
104
- str.gsub(/\{\{(.*?)\}\}/, '#{\1}').gsub(/\s?\|\s?/, ' || ').gsub('"', '\"')
105
- end
106
- end
107
-
108
6
  class KubeConfigParser
109
7
  def self.parse(template_path, variable_path)
110
- ifelse_stack = IfElseStack.new
111
-
112
- yml_content = File.open(template_path).read.each_line.map(&:chomp).to_a
113
- env_lines = []
114
- normal_lines = []
115
-
116
- in_if_else_block = false
117
- if_else_matched_condition = nil
118
- if_else_matched_lines = []
119
-
120
- yml_content.each do |line|
121
- match_result = line.match(/^\{\% (set (.*?)) \%\}$/)
122
- if match_result
123
- env_lines << match_result[1]
124
- else
125
- if in_if_else_block
126
- match_if_else_end = line.match(/\{\% endif -?\%\}/)
127
- if match_if_else_end
128
- ifelse_stack.push(if_else_matched_condition, if_else_matched_lines.join("\n"))
129
- normal_lines << '#{ifelse_stack.top}'
130
- in_if_else_block = false
131
- if_else_matched_condition = nil
132
- if_else_matched_lines = []
133
- else
134
- if line.match(/\{\{.*?\}\}/)
135
- if_else_matched_lines << RubyStrParser.parse(line)
136
- else
137
- if_else_matched_lines << line
138
- end
139
- end
140
- else # not in if else block
141
- match_if_else_start = line.match(/\{\% if (.*?) (is defined )?-?\%\}/)
142
- if match_if_else_start
143
- in_if_else_block = true
144
- if_else_matched_condition = match_if_else_start[1]
145
- else
146
- normal_lines << line
147
- end
148
- end
149
- end
150
- end
8
+ variable_hash = YAML.load(File.open(variable_path).read)
9
+ config_template = File.open(template_path).read
151
10
 
152
- var_table = YAML.load(File.open(variable_path).read)
153
-
154
- normal_yml_content = normal_lines.join("\n")
155
- normal_yml_content
156
-
157
- parser = EnvParser.new(var_table, ifelse_stack)
158
- ifelse_stack.set_env_parser(parser)
159
-
160
- env_lines.each do |first_line|
161
- parser.update(first_line)
162
- end
163
-
164
- ruby_style_content = RubyStrParser.parse(normal_yml_content)
165
- parser.echo(ruby_style_content)
11
+ pm = Paragraph.new(config_template, variable_hash)
12
+ return pm.parse
166
13
  end
167
14
  end
168
15
  end
16
+
17
+
18
+ if __FILE__ == $0
19
+ template_path = "resource/hdrs/service.yml.j2.old"
20
+ variable_path = "resource/hdrs/service_test.yml"
21
+
22
+ puts ParserModule::KubeConfigParser.parse(template_path, variable_path)
23
+ end
@@ -0,0 +1,116 @@
1
+ require_relative 'expression'
2
+
3
+ class Explainer
4
+
5
+ @expression_map = {}
6
+
7
+ class << self
8
+ attr_accessor :expression_map
9
+ end
10
+
11
+ def self.inherited(sub_klass)
12
+ sub_klass.class_eval do
13
+ def self.register_expression(reg_exp)
14
+ Explainer.expression_map[reg_exp] = self
15
+ end
16
+ end
17
+ end
18
+
19
+ def initialize(paragraph)
20
+ @paragraph = paragraph
21
+ end
22
+
23
+ def explain(lines)
24
+ new_lines = []
25
+
26
+ while not lines.empty?
27
+ line = lines[0]
28
+
29
+ matched_explainer_expression = self.class.expression_map.keys.find do |key|
30
+ line.match(key)
31
+ end
32
+
33
+ if matched_explainer_expression
34
+ matched_explainer = self.class.expression_map[matched_explainer_expression]
35
+ lines = matched_explainer.handle(lines)
36
+ else
37
+ new_lines << lines.shift
38
+ end
39
+ end
40
+
41
+ return new_lines
42
+ end
43
+ end
44
+
45
+ class GlobalSetter < Explainer
46
+ START_REG = /^\{% set (.*?) %\}/
47
+ register_expression START_REG
48
+
49
+ def self.handle(paragraph_lines)
50
+ line = paragraph_lines.shift
51
+ content = line.match(START_REG)[1].gsub(' ','')
52
+ target, expression_str = content.split('=')
53
+ value = ExpressionPipe.handle(expression_str)
54
+ ParameterCenter.instance.register_item({target.to_sym => value})
55
+ return paragraph_lines
56
+ end
57
+ end
58
+
59
+ class SimpleParser < Explainer
60
+ START_REG = /\{\{(.*?)\}\}/
61
+ register_expression START_REG
62
+
63
+ def self.handle(paragraph_lines)
64
+ line = paragraph_lines.shift
65
+ content = line.match(START_REG)[1]
66
+ value = ExpressionPipe.handle(content)
67
+
68
+ element = '{{' + content + '}}'
69
+ start_index = line.index(element)
70
+ end_index = start_index + element.size - 1
71
+ line[start_index..end_index] = value.to_s
72
+ paragraph_lines.insert(0, line)
73
+ end
74
+ end
75
+
76
+ class IfDefinedBlocker < Explainer
77
+ START_REG = /\{% if (.*?) is defined -%\}/
78
+ END_REG = /\{% endif -%\}/
79
+
80
+ register_expression self::START_REG
81
+
82
+ def self.handle(paragraph_lines)
83
+
84
+ block_lines = []
85
+ while not (line = paragraph_lines.shift).match(self::END_REG)
86
+ block_lines << line
87
+ end
88
+ block_lines << line
89
+
90
+ condition_line = block_lines[0]
91
+ content = condition_line.match(self::START_REG)[1]
92
+
93
+ begin
94
+ value = ExpressionPipe.handle(content)
95
+ raise NoMethodError if value.nil?
96
+
97
+ block_inner_lines = block_lines[1..-2]
98
+ paragraph_lines = block_inner_lines + paragraph_lines
99
+ rescue NoMethodError
100
+ # should be but no log currently
101
+ end
102
+
103
+ return paragraph_lines
104
+ end
105
+
106
+ end
107
+
108
+
109
+ class IfBlocker < IfDefinedBlocker
110
+
111
+ START_REG = /\{% if (.*?) %\}/
112
+ END_REG = /\{% endif %\}/
113
+ register_expression self::START_REG
114
+
115
+ end
116
+
@@ -0,0 +1,69 @@
1
+ require_relative 'parameter_center'
2
+
3
+ class ExpressionPipe
4
+
5
+ def self.handle(expression_str)
6
+ expressions = expression_str.split('|').map {|expression_str| Expression.generate(expression_str) }
7
+ result = expressions.inject(nil){ |param, expression| expression.handle(param) }
8
+ return result
9
+ end
10
+
11
+ end
12
+
13
+ class Expression
14
+ @expression_map ={}
15
+
16
+ class << self
17
+ attr_accessor :expression_map
18
+ end
19
+
20
+ def self.inherited(sub_klass)
21
+ sub_klass.class_eval do
22
+ def self.register_method(method_name)
23
+ Expression.expression_map[method_name] = self
24
+ end
25
+ end
26
+ end
27
+
28
+
29
+ def self.generate(expression_str)
30
+ result = ParameterCenter.instance.parse(expression_str)
31
+ result = NormalString.new(result) if not result.is_a? Expression
32
+
33
+ return result
34
+ end
35
+
36
+ def initialize(*parameters)
37
+ @parameters = parameters
38
+ end
39
+
40
+
41
+ def handle(previous_value)
42
+ raise NotImplementedError
43
+ end
44
+
45
+ end
46
+
47
+
48
+ class B64encoder < Expression
49
+ register_method :b64encode
50
+
51
+ def handle(_)
52
+ return @parameters.first
53
+ end
54
+
55
+ end
56
+
57
+ class DefaultString < Expression
58
+ register_method :default
59
+
60
+ def handle(previous_value)
61
+ previous_value || @parameters.first
62
+ end
63
+ end
64
+
65
+ class NormalString < Expression
66
+ def handle(_)
67
+ return @parameters.first
68
+ end
69
+ end
@@ -0,0 +1,35 @@
1
+ require 'extensions/to_os'
2
+
3
+ require_relative 'parameter_center'
4
+ require_relative 'expression'
5
+ require_relative 'explainer'
6
+
7
+ class Paragraph
8
+ def initialize(paragraph_content, variable_content)
9
+ @paragraph_lines = paragraph_content.lines.map(&:chomp)
10
+ @variables = {:item => OpenStruct.to_os(variable_content)}
11
+
12
+ ParameterCenter.instance.register_item(@variables)
13
+ ParameterCenter.instance.register_item(Expression.expression_map)
14
+ end
15
+
16
+ def parse
17
+ explainer = Explainer.new(self)
18
+ lines = Marshal.load(Marshal.dump(@paragraph_lines))
19
+ new_lines = explainer.explain(lines)
20
+ return new_lines
21
+ end
22
+ end
23
+
24
+
25
+ if __FILE__ == $0
26
+ yaml_file = 'resource/service_master.yml'
27
+ require 'yaml'
28
+ variable_hash = YAML.load(File.open(yaml_file).read)
29
+
30
+ config_template_file= 'resource/service.yml.j2'
31
+ config_template = File.open(config_template_file).read
32
+
33
+ pm = Paragraph.new(config_template, variable_hash)
34
+ pm.parse
35
+ end
@@ -0,0 +1,35 @@
1
+ require 'singleton'
2
+
3
+ class ParameterCenter
4
+ include Singleton
5
+
6
+ False = false
7
+ True = true
8
+
9
+ attr_reader :registered_item_map
10
+
11
+ def initialize
12
+ @registered_item_map = {}
13
+ end
14
+
15
+ def register_item(item)
16
+ item.keys.each do |key|
17
+ @registered_item_map[key] = item[key]
18
+ end
19
+ end
20
+
21
+ def parse(str)
22
+ eval(str)
23
+ end
24
+
25
+ def method_missing(method_name_sym, *args)
26
+ target = @registered_item_map[method_name_sym]
27
+
28
+ if args.empty?
29
+ return target
30
+ else
31
+ return target.new(*args)
32
+ end
33
+
34
+ end
35
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kube-config-parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yukai Jin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-26 00:00:00.000000000 Z
11
+ date: 2019-01-24 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: a simple kube config parser
14
14
  email: fish1928@outlook.com
@@ -16,7 +16,12 @@ executables: []
16
16
  extensions: []
17
17
  extra_rdoc_files: []
18
18
  files:
19
+ - lib/extensions/to_os.rb
19
20
  - lib/utils/kube_config_parser.rb
21
+ - lib/utils/kube_config_parser/explainer.rb
22
+ - lib/utils/kube_config_parser/expression.rb
23
+ - lib/utils/kube_config_parser/paragraph.rb
24
+ - lib/utils/kube_config_parser/parameter_center.rb
20
25
  homepage: https://github.com/fish1928/KubeConfigParser
21
26
  licenses:
22
27
  - MIT
@@ -40,5 +45,5 @@ rubyforge_project:
40
45
  rubygems_version: 2.6.12
41
46
  signing_key:
42
47
  specification_version: 4
43
- summary: KubeConfigparser
48
+ summary: KubeConfigParser
44
49
  test_files: []