hydrochlorb 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 947e3a2ebc93d0120010473a9d369d012ea41fec964977f6fff0265c339dedb3
4
+ data.tar.gz: 940ed1b23d7494a12eb03b4c7149f726c3d1ecdec2a1d314cf0e97722bc9e65f
5
+ SHA512:
6
+ metadata.gz: 6819460fc7aa8892c4ce7487dc0599d90aa77540f8da6e4ab701e1161ea28dfd317c2da22239a795ed795c94cf00ae1dd63e6cf4877fdd1727ee87569ec754d2
7
+ data.tar.gz: 225db29231e48ee7e355fdfee03163ab5a3e47e69ad4b64b18d970243701536257e93943f1986c73dff22cef2bb7f1f3b2f91e503e842d5226216fa23f6985a2
@@ -0,0 +1,57 @@
1
+ require 'json'
2
+
3
+ class Hydrochlorb::Builder
4
+ def initialize(options = {}, &block)
5
+ @attributes = {}
6
+ @current = @attributes
7
+
8
+ build(&block) if block_given?
9
+ end
10
+
11
+ def build(&block)
12
+ return unless block_given?
13
+
14
+ instance_eval(&block)
15
+
16
+ self
17
+ end
18
+
19
+ def method_missing(method, *args, &block)
20
+ add(method, *args, &block)
21
+ end
22
+
23
+ def add(*args, &block)
24
+ if block_given?
25
+ obj = {}
26
+ k = args.first.to_sym
27
+
28
+ @current[k] = [] unless @current[k].is_a? Array
29
+ @current[k] << obj
30
+
31
+ c = obj
32
+ args[1..-1].each do |k|
33
+ obj = {}
34
+ c[k.to_sym] = obj
35
+ c = obj
36
+ end
37
+
38
+ previous = @current
39
+ @current = obj
40
+ instance_eval(&block)
41
+ @current = previous
42
+ elsif args.length > 1
43
+ method = args.shift.to_sym
44
+ @current[method] = args.length == 1 ? args.first : args
45
+ else
46
+ raise ArgumentError, "One key and at least one of values are required: #{args.join(',')}"
47
+ end
48
+ end
49
+
50
+ def to_json
51
+ @attributes.to_json
52
+ end
53
+
54
+ def to_hcl(*args)
55
+ Hydrochlorb::Serializer.serialize(@attributes, *args)
56
+ end
57
+ end
@@ -0,0 +1,42 @@
1
+ class Hydrochlorb::Serializer
2
+ class << self
3
+ def serialize(obj, options = {})
4
+ indent = options[:indent]
5
+ indent = 2 unless indent.is_a? Integer and indent >= 0
6
+
7
+ dump(obj, nil, indent, 0)
8
+ end
9
+
10
+ private
11
+
12
+ def dump(obj, key = nil, indent = 0, depth = 0)
13
+ prefix = ' ' * indent * depth
14
+
15
+ case obj
16
+ when Array
17
+ if obj.all? { |v| v.is_a? Hash }
18
+ obj.map do |v|
19
+ send(__method__, v, key, indent, depth)
20
+ end.compact.join("\n")
21
+ else
22
+ "#{prefix}#{key} = [" + obj.map { |v| send(__method__, v) }.compact.join(', ') + ']'
23
+ end
24
+ when Hash
25
+ compacted = key.to_s.empty? || (!obj.empty? && obj.values.all? { |v| v.is_a? Hash })
26
+
27
+ str = obj.map do |k, v|
28
+ k = k.to_s.strip
29
+ k = k.inspect unless k =~ /^\w+$/ and (key.to_s.empty? or not compacted)
30
+
31
+ a = send(__method__, v, (compacted ? "#{key} #{k}".strip : k), indent, (compacted ? depth : depth + 1))
32
+ end.compact.join("\n")
33
+
34
+ compacted ? str : "#{prefix}#{key} {\n" + (str.empty? ? '' : "#{str}\n" )+ "#{prefix}}"
35
+ when Numeric, TrueClass, FalseClass
36
+ (key ? "#{prefix}#{key} = " : '') + obj.inspect
37
+ else
38
+ (key ? "#{prefix}#{key} = " : '') + obj.to_s.inspect unless obj.nil?
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,8 @@
1
+ module Hydrochlorb
2
+ VERSION = '0.0.1'.freeze
3
+
4
+ def version
5
+ VERSION
6
+ end
7
+ module_function :version
8
+ end
@@ -0,0 +1,10 @@
1
+ module Hydrochlorb
2
+ def build(*args, &block)
3
+ Hydrochlorb::Builder.new(*args, &block)
4
+ end
5
+ module_function :build
6
+ end
7
+
8
+ require 'hydrochlorb/builder'
9
+ require 'hydrochlorb/serializer'
10
+ require 'hydrochlorb/version'
@@ -0,0 +1,181 @@
1
+ describe Hydrochlorb do
2
+ it 'can handle primitive types' do
3
+ hcl = Hydrochlorb.build do
4
+ it_is_integer 1
5
+ it_is_negtive_integer -1
6
+ it_is_float 1.23
7
+ it_is_negtive_float -1.23
8
+ it_is_string 'foo'
9
+ it_is_null nil
10
+ it_is_true true
11
+ it_is_false false
12
+ it_is_array [1, -2, 3.3, -4.4, 'bar', nil, true, false]
13
+ end.to_hcl
14
+
15
+ expect(hcl).to eq <<~EOF.chomp
16
+ it_is_integer = 1
17
+ it_is_negtive_integer = -1
18
+ it_is_float = 1.23
19
+ it_is_negtive_float = -1.23
20
+ it_is_string = "foo"
21
+ it_is_true = true
22
+ it_is_false = false
23
+ it_is_array = [1, -2, 3.3, -4.4, "bar", true, false]
24
+ EOF
25
+ end
26
+
27
+ it 'can handle array object' do
28
+ hcl = Hydrochlorb.build do
29
+ it_is_array_object {
30
+ foo 'bar'
31
+ }
32
+ end.to_hcl
33
+
34
+ expect(hcl).to eq <<~EOF.chomp
35
+ it_is_array_object {
36
+ foo = "bar"
37
+ }
38
+ EOF
39
+ end
40
+
41
+ it 'can handle empty array object' do
42
+ hcl = Hydrochlorb.build do
43
+ it_is_array_object {
44
+ }
45
+ end.to_hcl
46
+
47
+ expect(hcl).to eq <<~EOF.chomp
48
+ it_is_array_object {
49
+ }
50
+ EOF
51
+ end
52
+
53
+ it 'can handle object' do
54
+ hcl = Hydrochlorb.build do
55
+ it_is_object 'obj' do
56
+ foo 'bar'
57
+ end
58
+ end.to_hcl
59
+
60
+ expect(hcl).to eq <<~EOF.chomp
61
+ it_is_object "obj" {
62
+ foo = "bar"
63
+ }
64
+ EOF
65
+ end
66
+
67
+ it 'can handle empty object' do
68
+ hcl = Hydrochlorb.build do
69
+ it_is_object 'obj' do
70
+ end
71
+ end.to_hcl
72
+
73
+ expect(hcl).to eq <<~EOF.chomp
74
+ it_is_object "obj" {
75
+ }
76
+ EOF
77
+ end
78
+
79
+ it 'can handle object with multiple keys' do
80
+ hcl = Hydrochlorb.build do
81
+ it_is_object 'o', 'b', 'j' do
82
+ foo 'bar'
83
+ end
84
+ end.to_hcl
85
+
86
+ expect(hcl).to eq <<~EOF.chomp
87
+ it_is_object "o" "b" "j" {
88
+ foo = "bar"
89
+ }
90
+ EOF
91
+ end
92
+
93
+ it 'can handle nested data types' do
94
+ hcl = Hydrochlorb.build do
95
+ foo 'bar'
96
+ obj 'nested', 'obj' do
97
+ obj 'obj', 'in', 'obj' do
98
+ float 3.14
99
+ arr {
100
+ int 123
101
+ }
102
+ arr {
103
+ bool true
104
+ arr_in_arr {
105
+ bool false
106
+ }
107
+ }
108
+ end
109
+ end
110
+ end.to_hcl
111
+
112
+ expect(hcl).to eq <<~EOF.chomp
113
+ foo = "bar"
114
+ obj "nested" "obj" {
115
+ obj "obj" "in" "obj" {
116
+ float = 3.14
117
+ arr {
118
+ int = 123
119
+ }
120
+ arr {
121
+ bool = true
122
+ arr_in_arr {
123
+ bool = false
124
+ }
125
+ }
126
+ }
127
+ }
128
+ EOF
129
+ end
130
+
131
+ it 'can handle multiple builds' do
132
+ builder = Hydrochlorb.build do
133
+ obj {
134
+ first 1
135
+ }
136
+ end
137
+
138
+ hcl = builder.build do
139
+ second 2
140
+ end.to_hcl
141
+
142
+ expect(hcl).to eq <<~EOF.chomp
143
+ obj {
144
+ first = 1
145
+ }
146
+ second = 2
147
+ EOF
148
+ end
149
+
150
+ it 'can serialize with different indent' do
151
+ hcl = Hydrochlorb.build do
152
+ foo 'bar'
153
+ obj 'nested', 'obj' do
154
+ obj 'obj', 'in', 'obj' do
155
+ float 3.14
156
+ arr {
157
+ int 123
158
+ }
159
+ arr {
160
+ bool true
161
+ }
162
+ end
163
+ end
164
+ end.to_hcl(indent: 4)
165
+
166
+ expect(hcl).to eq <<~EOF.chomp
167
+ foo = "bar"
168
+ obj "nested" "obj" {
169
+ obj "obj" "in" "obj" {
170
+ float = 3.14
171
+ arr {
172
+ int = 123
173
+ }
174
+ arr {
175
+ bool = true
176
+ }
177
+ }
178
+ }
179
+ EOF
180
+ end
181
+ end
@@ -0,0 +1 @@
1
+ require 'hydrochlorb'
metadata ADDED
@@ -0,0 +1,96 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hydrochlorb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Rianol Jou
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-08-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.2
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 2.0.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 12.3.3
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 12.3.3
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 3.8.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 3.8.0
55
+ description: " Provide a similar way to config HCL (HashiCorp Configuration Language)
56
+ in ruby. And featuring all programming features (variables, iterators, functions,
57
+ regexp, etc) in ruby.\n"
58
+ email:
59
+ - rianol.jou@gmail.com
60
+ executables: []
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - lib/hydrochlorb.rb
65
+ - lib/hydrochlorb/builder.rb
66
+ - lib/hydrochlorb/serializer.rb
67
+ - lib/hydrochlorb/version.rb
68
+ - spec/hydrochlorb_spec.rb
69
+ - spec/spec_helper.rb
70
+ homepage: https://github.com/RiANOl/hydrochlorb
71
+ licenses:
72
+ - MIT
73
+ metadata: {}
74
+ post_install_message:
75
+ rdoc_options: []
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ required_rubygems_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ requirements: []
89
+ rubygems_version: 3.0.3
90
+ signing_key:
91
+ specification_version: 4
92
+ summary: Provide a similar way to config HCL (HashiCorp Configuration Language) in
93
+ ruby.
94
+ test_files:
95
+ - spec/hydrochlorb_spec.rb
96
+ - spec/spec_helper.rb