1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
# frozen_string_literal: true
module Aws
module Partitions
class PartitionList
include Enumerable
def initialize
@partitions = {}
end
# @return [Enumerator<Partition>]
def each(&block)
@partitions.each_value(&block)
end
# @param [String] partition_name
# @return [Partition]
def partition(partition_name)
if @partitions.key?(partition_name)
@partitions[partition_name]
else
msg = "invalid partition name #{partition_name.inspect}; valid "\
"partition names include %s" % [@partitions.keys.join(', ')]
raise ArgumentError, msg
end
end
# @return [Array<Partition>]
def partitions
@partitions.values
end
# @param [Partition] partition
# @api private
def add_partition(partition)
if Partition === partition
@partitions[partition.name] = partition
else
raise ArgumentError, "expected Partition, got #{partition.class}"
end
end
# @param [Partition] partition
# @api private
def merge_metadata(partitions_metadata)
partitions_metadata['partitions'].each do |partition_metadata|
outputs = partition_metadata['outputs']
if existing = @partitions[partition_metadata['id']]
@partitions[partition_metadata['id']] = Partition.new(
name: existing.name,
regions: build_metadata_regions(
partition_metadata['id'],
partition_metadata['regions'],
existing),
region_regex: partition_metadata['regionRegex'],
services: existing.services.each_with_object({}) do |s, services|
services[s.name] = s
end,
metadata: outputs
)
else
@partitions[partition_metadata['id']] = Partition.new(
name: partition_metadata['id'],
regions: build_metadata_regions(
partition_metadata['id'], partition_metadata['regions']
),
region_regex: partition_metadata['regionRegex'],
services: {},
metadata: outputs
)
end
end
end
# Removed all partitions.
# @api private
def clear
@partitions = {}
end
private
def build_metadata_regions(partition_name, metadata_regions, existing = nil)
metadata_regions.each_with_object({}) do |(region_name, region), regions|
if existing && existing.region?(region_name)
regions[region_name] = existing.region(region_name)
else
regions[region_name] = Region.new(
name: region_name,
description: region['description'],
partition_name: partition_name,
services: Set.new
)
end
end
end
class << self
# @api private
def build(partitions)
partitions['partitions'].inject(PartitionList.new) do |list, partition|
list.add_partition(Partition.build(partition))
list
end
end
end
end
end
end
|