cfa 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/cfa/augeas_parser.rb +15 -1
- data/lib/cfa/augeas_parser/writer.rb +38 -6
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ed36ef61432f274fddde803ec94e699e1cdaa96c
|
4
|
+
data.tar.gz: 5ab4d242ebbbec5a794ed6b2309d76396f7a69ee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b7f9e87b62d41a80f332c123317a3ab01368ea2c32c544b7338b3dd0977f9fe3d1ed28e5c8807c58a9ec50bdf3b77a3c9eb029a3ce2c56bb01fe634b646bfdda
|
7
|
+
data.tar.gz: c60aa0011596224752a97a0b8ecc6df8b883603e9c559df15920d3609ff9f763eec59c988bd8eca884938e83ffb6c0359145a3646863fd7c57ee88707c5363b8
|
data/lib/cfa/augeas_parser.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require "set"
|
1
2
|
require "augeas"
|
2
3
|
require "forwardable"
|
3
4
|
require "cfa/placer"
|
@@ -158,6 +159,19 @@ module CFA
|
|
158
159
|
@data = []
|
159
160
|
end
|
160
161
|
|
162
|
+
# Gets new unique id in numberic sequence. Useful for augeas models that
|
163
|
+
# using sequences like /etc/hosts . It have keys like "1", "2" and when
|
164
|
+
# adding new one it need to find new key.
|
165
|
+
def unique_id
|
166
|
+
# check all_data instead of data, as we have to not reuse deleted key
|
167
|
+
ids = Set.new(all_data.map { |e| e[:key] })
|
168
|
+
id = 1
|
169
|
+
loop do
|
170
|
+
return id.to_s unless ids.include?(id.to_s)
|
171
|
+
id += 1
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
161
175
|
# @return [AugeasCollection] collection for *key*
|
162
176
|
def collection(key)
|
163
177
|
AugeasCollection.new(self, key)
|
@@ -217,7 +231,7 @@ module CFA
|
|
217
231
|
# @param matcher [Matcher]
|
218
232
|
# @return [Array<AugeasElement>] matching elements
|
219
233
|
def select(matcher)
|
220
|
-
|
234
|
+
data.select(&matcher)
|
221
235
|
end
|
222
236
|
|
223
237
|
def ==(other)
|
@@ -184,7 +184,7 @@ module CFA
|
|
184
184
|
# one after another then the latter cannot affect the former
|
185
185
|
@operations.reverse_each do |operation|
|
186
186
|
case operation[:type]
|
187
|
-
when :remove then
|
187
|
+
when :remove then remove_entry(operation[:path])
|
188
188
|
when :add
|
189
189
|
located_entry = operation[:located_entry]
|
190
190
|
add_entry(located_entry)
|
@@ -198,6 +198,28 @@ module CFA
|
|
198
198
|
|
199
199
|
attr_reader :aug
|
200
200
|
|
201
|
+
# Removes entry from tree. If *path* does not exist, then tries if it
|
202
|
+
# has changed to a collection:
|
203
|
+
# If we remove and re-add a single key then because of the laziness
|
204
|
+
# Augeas will first see the addition, making a 2 member collection,
|
205
|
+
# so we need to remove "key[1]" instead of "key".
|
206
|
+
# @param path [String] original path name to remove
|
207
|
+
def remove_entry(path)
|
208
|
+
aug.rm(path_to_remove(path))
|
209
|
+
end
|
210
|
+
|
211
|
+
# Finds path to remove, as path can be meanwhile renumbered, see
|
212
|
+
# #remove_entry
|
213
|
+
def path_to_remove(path)
|
214
|
+
if aug.match(path).size == 1
|
215
|
+
path
|
216
|
+
elsif !aug.match(path + "[1]").empty?
|
217
|
+
path + "[1]"
|
218
|
+
else
|
219
|
+
raise "Unknown augeas path #{path}"
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
201
223
|
# Adds entry to tree. At first it finds where to add it to be in correct
|
202
224
|
# place and then sets its value. Recursive if needed. In recursive case
|
203
225
|
# it is already known that whole sub-tree is also new and just added.
|
@@ -214,11 +236,11 @@ module CFA
|
|
214
236
|
# @see https://github.com/hercules-team/augeas/wiki/Path-expressions
|
215
237
|
def set_new_value(path, located_entry)
|
216
238
|
aug.set(path, located_entry.entry_value)
|
217
|
-
prefix = path[/(^.*)
|
239
|
+
prefix = path[/(^.*)\[[^\]]*\]/, 1] || path
|
218
240
|
# we need to get new path as set can look like [last() + 1]
|
219
241
|
# which creates new entry and we do not want to add subtree to new
|
220
242
|
# entries
|
221
|
-
new_path = aug.match(prefix + "
|
243
|
+
new_path = aug.match(prefix + "[last()]").first
|
222
244
|
add_subtree(located_entry.entry_tree, new_path)
|
223
245
|
end
|
224
246
|
|
@@ -267,9 +289,19 @@ module CFA
|
|
267
289
|
# @return [String] where value should be written.
|
268
290
|
def insert_after(preceding, located_entry)
|
269
291
|
aug.insert(preceding.path, located_entry.key, false)
|
270
|
-
|
271
|
-
|
272
|
-
|
292
|
+
path_after(preceding)
|
293
|
+
end
|
294
|
+
|
295
|
+
# Finds path immediately after preceding entry
|
296
|
+
# @param preceding [LocatedEntry]
|
297
|
+
def path_after(preceding)
|
298
|
+
paths = aug.match(preceding.prefix + "/*")
|
299
|
+
preceding_index = paths.index(preceding.path)
|
300
|
+
# it can happen, that insertion change previous entry from
|
301
|
+
# e.g. #comment to #comment[1]. Can happen only if it switch from
|
302
|
+
# single entry to collection
|
303
|
+
preceding_index ||= paths.index(preceding.path + "[1]")
|
304
|
+
paths[preceding_index + 1]
|
273
305
|
end
|
274
306
|
end
|
275
307
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cfa
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josef Reidinger
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-03-
|
11
|
+
date: 2017-03-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-augeas
|
@@ -61,10 +61,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
61
61
|
version: 1.3.6
|
62
62
|
requirements: []
|
63
63
|
rubyforge_project:
|
64
|
-
rubygems_version: 2.
|
64
|
+
rubygems_version: 2.4.5.2
|
65
65
|
signing_key:
|
66
66
|
specification_version: 4
|
67
67
|
summary: CFA (Config Files API) provides an easy way to create models on top of configuration
|
68
68
|
files
|
69
69
|
test_files: []
|
70
|
-
has_rdoc:
|