Sha256: b453975b7539bab8da3f8329594c354f9b509cb0ab668b62549c9c84901ba9e8

Contents?: true

Size: 1.75 KB

Versions: 15

Compression:

Stored size: 1.75 KB

Contents

module DropboxApi::Metadata
  class Base
    class << self
      attr_reader :fields

      def field(name, type, *options)
        @fields ||= {}
        @fields[name] = DropboxApi::Metadata::Field.new(type, options)

        attr_reader name
      end
    end

    # Takes in a hash containing all the attributes required to initialize the
    # object.
    #
    # Each hash entry should have a key which identifies a field and its value,
    # so a valid call would be something like this:
    #
    #     DropboxApi::Metadata::File.new({
    #       "name" => "a.jpg",
    #       "path_lower" => "/a.jpg",
    #       "path_display" => "/a.jpg",
    #       "id" => "id:evvfE6q6cK0AAAAAAAAB2w",
    #       "client_modified" => "2016-10-19T17:17:34Z",
    #       "server_modified" => "2016-10-19T17:17:34Z",
    #       "rev" => "28924061bdd",
    #       "size" => 396317
    #     })
    #
    # @raise [ArgumentError] If a required attribute is missing.
    # @param metadata [Hash]
    def initialize(metadata)
      self.class.fields.keys.each do |field_name|
        self[field_name] = metadata[field_name.to_s]
      end
    end

    def to_hash
      Hash[self.class.fields.keys.map do |field_name|
        [field_name.to_s, serialized_field(field_name)]
      end.select { |k, v| !v.nil? }]
    end

    def serialized_field(field_name)
      value = send field_name
      case value
      when Time
        value.utc.strftime("%FT%TZ")
      when DropboxApi::Metadata::Base
        value.to_hash
      else
        value
      end
    end

    private

    def []=(name, value)
      instance_variable_set "@#{name}", self.class.fields[name].cast(value)
    rescue ArgumentError
      raise ArgumentError, "Invalid value for `#{name}`: #{value.inspect}."
    end
  end
end

Version data entries

15 entries across 15 versions & 1 rubygems

Version Path
dropbox_api-0.1.18 lib/dropbox_api/metadata/base.rb
dropbox_api-0.1.17 lib/dropbox_api/metadata/base.rb
dropbox_api-0.1.16 lib/dropbox_api/metadata/base.rb
dropbox_api-0.1.15 lib/dropbox_api/metadata/base.rb
dropbox_api-0.1.14 lib/dropbox_api/metadata/base.rb
dropbox_api-0.1.13 lib/dropbox_api/metadata/base.rb
dropbox_api-0.1.12 lib/dropbox_api/metadata/base.rb
dropbox_api-0.1.11 lib/dropbox_api/metadata/base.rb
dropbox_api-0.1.10 lib/dropbox_api/metadata/base.rb
dropbox_api-0.1.9 lib/dropbox_api/metadata/base.rb
dropbox_api-0.1.8 lib/dropbox_api/metadata/base.rb
dropbox_api-0.1.7 lib/dropbox_api/metadata/base.rb
dropbox_api-0.1.6 lib/dropbox_api/metadata/base.rb
dropbox_api-0.1.5 lib/dropbox_api/metadata/base.rb
dropbox_api-0.1.4 lib/dropbox_api/metadata/base.rb