lib/gcloud/storage/bucket/cors.rb in gcloud-0.11.0 vs lib/gcloud/storage/bucket/cors.rb in gcloud-0.12.0

- old
+ new

@@ -20,12 +20,11 @@ class Bucket ## # # Bucket Cors # # A special-case Array for managing the website CORS rules for a bucket. - # Accessed via a block argument to {Project#create_bucket}, {Bucket#cors}, - # or {Bucket#update}. + # Accessed via {Bucket#cors}. # # @see https://cloud.google.com/storage/docs/cross-origin Cross-Origin # Resource Sharing (CORS) # # @example @@ -33,33 +32,34 @@ # # gcloud = Gcloud.new # storage = gcloud.storage # bucket = storage.bucket "my-todo-app" # + # bucket = storage.bucket "my-bucket" # bucket.cors do |c| # # Remove the last CORS rule from the array # c.pop # # Remove all existing rules with the https protocol - # c.delete_if { |r| r["origin"].include? "http://example.com" } + # c.delete_if { |r| r.origin.include? "http://example.com" } # c.add_rule ["http://example.org", "https://example.org"], # ["GET", "POST", "DELETE"], # response_headers: ["X-My-Custom-Header"], # max_age: 3600 # end # class Cors < DelegateClass(::Array) ## # @private # Initialize a new CORS rules builder with existing CORS rules, if any. - def initialize cors = [] - super cors.dup - @original = cors.dup + def initialize rules = [] + super rules + @original = to_gapi.map(&:to_json) end # @private def changed? - @original != self + @original != to_gapi.map(&:to_json) end ## # Add a CORS rule to the CORS rules for a bucket. Accepts options for # setting preflight response headers. Preflight requests and responses @@ -96,13 +96,57 @@ # response_headers: ["X-My-Custom-Header"], # max_age: 300 # end # def add_rule origin, methods, headers: nil, max_age: nil - rule = { "origin" => Array(origin), "method" => Array(methods) } - rule["responseHeader"] = Array(headers) || [] - rule["maxAgeSeconds"] = max_age || 1800 - push rule + push Rule.new(origin, methods, headers: headers, max_age: max_age) + end + + # @private + def to_gapi + map(&:to_gapi) + end + + # @private + def self.from_gapi gapi_list + rules = Array(gapi_list).map { |gapi| Rule.from_gapi gapi } + new rules + end + + # @private + def freeze + each(&:freeze) + super + end + + class Rule + attr_accessor :origin, :methods, :headers, :max_age + + def initialize origin, methods, headers: nil, max_age: nil + @origin = Array(origin) + @methods = Array(methods) + @headers = Array(headers) + @max_age = (max_age||1800) + end + + def to_gapi + Google::Apis::StorageV1::Bucket::CorsConfiguration.new( + origin: Array(origin).dup, http_method: Array(methods).dup, + response_header: Array(headers).dup, max_age_seconds: max_age + ) + end + + def self.from_gapi gapi + new gapi.origin.dup, gapi.http_method.dup, \ + headers: gapi.response_header.dup, max_age: gapi.max_age_seconds + end + + def freeze + @origin.freeze + @methods.freeze + @headers.freeze + super + end end end end end end