structurebutcher 0.1.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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/structurebutcher.rb +126 -0
  3. metadata +86 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: dfa37f9b9be3237458a70a0c7938b48090e207f0
4
+ data.tar.gz: 45358a765341ff44cd9e5d96fb6f4b7c3b30ee9c
5
+ SHA512:
6
+ metadata.gz: 3efe06a3ea533b9846a93a9c7603f8e2f7fcbcfb928e6e6a7539465b9e8508876b07f06624f00167aaff3fb9c434c4b1a554cc3788895131dd69549d038b2939
7
+ data.tar.gz: 289652b9b8c228983b36329e47c89d18b1135730c00eec04a09c2e865b10b503422b8d8347982ef56d4dd8c42970c3ffff647c2c9cbca4a6a1b2e0b72e390a49
@@ -0,0 +1,126 @@
1
+ require 'json'
2
+ require 'yaml'
3
+ require 'java-properties'
4
+ require 'hocon'
5
+ require 'hocon/parser/config_document_factory'
6
+ require 'hocon/config_value_factory'
7
+
8
+ #vyndavator, zastamdator
9
+ #amputovat, implantovat
10
+ #amputate, implantate
11
+
12
+ class StructureButcher
13
+ def amputate(body, slot)
14
+ keys = slot.split('.')
15
+ result = body
16
+ while (key = keys.shift)
17
+ result = result[key]
18
+ end
19
+ return result
20
+ end
21
+
22
+ def implantate(body, slot, part)
23
+ keys = slot.split('.')
24
+ last_key = keys.pop
25
+ area = body
26
+ while (key = keys.shift)
27
+ area = area[key] #TODO: create hash if not exists
28
+ end
29
+ area[last_key] = part
30
+ end
31
+
32
+ def amputate_file(body_file, slot, part_file, format)
33
+ parser = StructureButcher::Parser.new
34
+ body = parser.load_structure(body_file, "yaml")
35
+
36
+ butcher = StructureButcher.new
37
+ part = butcher.amputate(body, slot)
38
+
39
+ storer = StructureButcher::Storer.new
40
+ storer.save_structure(part, part_file, format)
41
+ end
42
+
43
+ def implantate_file(body_file, slot, part_file, format)
44
+ parser = StructureButcher::Parser.new
45
+ body = parser.load_structure(body_file, "yaml")
46
+ part = parser.load_structure(part_file, format)
47
+
48
+ butcher = StructureButcher.new
49
+ part = butcher.implantate(body, slot, part)
50
+
51
+ storer = StructureButcher::Storer.new
52
+ storer.save_structure(body, body_file, "yaml")
53
+ end
54
+ end
55
+
56
+ class StructureButcher::Parser
57
+ def load_structure(filename, format)
58
+ case format
59
+ when "json"
60
+ return load_json(filename)
61
+ when "yaml"
62
+ return load_yaml(filename)
63
+ when "properties"
64
+ return load_properties(filename)
65
+ when "hocon"
66
+ return load_hocon(filename)
67
+ else
68
+ throw "Not implemented"
69
+ end
70
+ end
71
+
72
+ def recursive_stringify_keys(h)
73
+ case h
74
+ when Hash
75
+ Hash[
76
+ h.map do |k, v|
77
+ [ k.respond_to?(:to_s) ? k.to_s : k,
78
+ recursive_stringify_keys(v)
79
+ ]
80
+ end
81
+ ]
82
+ when Enumerable
83
+ h.map { |v| recursive_stringify_keys(v) }
84
+ else
85
+ h
86
+ end
87
+ end
88
+
89
+ def load_json(filename)
90
+ file = File.read(filename)
91
+ return recursive_stringify_keys(JSON.parse(file))
92
+ end
93
+
94
+ def load_yaml(filename)
95
+ return recursive_stringify_keys(YAML.load_file(filename))
96
+ end
97
+
98
+ def load_properties(filename)
99
+ return recursive_stringify_keys(JavaProperties.load(filename))
100
+ end
101
+
102
+ def load_hocon(filename)
103
+ return recursive_stringify_keys(Hocon.load(filename))
104
+ end
105
+ end
106
+
107
+ class StructureButcher::Storer
108
+ def structure_in_format(structure, format)
109
+ case format
110
+ when "json"
111
+ return JSON.generate(structure)
112
+ when "yaml"
113
+ return structure.to_yaml
114
+ when "properties"
115
+ return JavaProperties.generate(structure)
116
+ when "hocon"
117
+ return JSON.generate(structure) #FIXME
118
+ else
119
+ throw "Unsupported format"
120
+ end
121
+ end
122
+
123
+ def save_structure(structure, filename, format)
124
+ File.write(filename, structure_in_format(structure, format))
125
+ end
126
+ end
metadata ADDED
@@ -0,0 +1,86 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: structurebutcher
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Miroslav Tynovsky
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-09-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: hocon
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.3
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.9.3
41
+ - !ruby/object:Gem::Dependency
42
+ name: java-properties
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.0.2
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.0.2
55
+ description: Take config and put it to YAML under specific key
56
+ email: tynovsky@avast.com
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - lib/structurebutcher.rb
62
+ homepage: https://github.com/tynovsky/structurebutcher
63
+ licenses:
64
+ - MIT
65
+ metadata: {}
66
+ post_install_message:
67
+ rdoc_options: []
68
+ require_paths:
69
+ - lib
70
+ required_ruby_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ requirements: []
81
+ rubyforge_project:
82
+ rubygems_version: 2.4.8
83
+ signing_key:
84
+ specification_version: 4
85
+ summary: Config saver/restorer
86
+ test_files: []