lib/build/environment/flatten.rb in build-environment-1.1.5 vs lib/build/environment/flatten.rb in build-environment-1.2.0
- old
+ new
@@ -21,14 +21,10 @@
require 'digest/md5'
module Build
class Environment
def to_h
- @values
- end
-
- def to_hash
hash = {}
# Flatten this chain of environments:
flatten_to_hash(hash)
@@ -37,19 +33,27 @@
# Evaluate all the individual environment values so that they are flat:
Hash[hash.map{|key, value| [key, evaluator.object_value(value)]}]
end
- def flatten
- self.class.new(nil, self.to_hash)
+ def evaluate(**options)
+ self.class.new(nil, self.to_h, **options)
end
+ def flatten(**options)
+ hash = {}
+
+ flatten_to_hash(hash)
+
+ return self.class.new(nil, hash, **options)
+ end
+
def defined
@values.select{|name,value| Define === value}
end
- def checksum(digester: Digest::MD5.new)
+ def checksum(digester: Digest::SHA1.new)
checksum_recursively(digester)
return digester.hexdigest
end
@@ -60,36 +64,60 @@
end
def checksum_recursively(digester)
sorted_keys.each do |key|
digester.update(key.to_s)
- digester.update(@values[key].to_s)
+
+ case value = @values[key]
+ when Proc
+ digester.update(value.source_location.join)
+ else
+ digester.update(value.to_s)
+ end
end
@parent.checksum_recursively(digester) if @parent
end
- # We fold in the ancestors one at a time from oldest to youngest.
- def flatten_to_hash(hash)
- if @parent
- @parent.flatten_to_hash(hash)
- end
-
+ def update_hash(hash)
@values.each do |key, value|
previous = hash[key]
-
+
if Replace === value
# Replace the parent value
hash[key] = value
- elsif Array === previous
- # Merge with the parent value
- hash[key] = previous + Array(value)
elsif Default === value
# Update the parent value if not defined.
hash[key] = previous || value
+ elsif Array === previous
+ # Merge with the parent value
+ hash[key] = previous + Array(value)
else
hash[key] = value
end
+ end
+
+ return self
+ end
+
+ # Apply the update function to this environment.
+ def update!
+ construct!(self, &@update)
+ @update = nil
+
+ return self
+ end
+
+ # We fold in the ancestors one at a time from oldest to youngest.
+ def flatten_to_hash(hash)
+ if parent = @parent
+ parent = parent.flatten_to_hash(hash)
+ end
+
+ if @update
+ self.dup(parent: parent).update!.update_hash(hash)
+ else
+ self.update_hash(hash)
end
end
end
end