Skip to content
代码片段 群组 项目
提交 2d751d63 编辑于 作者: Gabriel Mazetto's avatar Gabriel Mazetto
浏览文件

Extract Serializer and Deserializer

上级 01f71364
No related branches found
No related tags found
无相关合并请求
...@@ -8,6 +8,7 @@ module Cli ...@@ -8,6 +8,7 @@ module Cli
autoload :Commands, 'gitlab/backup/cli/commands' autoload :Commands, 'gitlab/backup/cli/commands'
autoload :Dependencies, 'gitlab/backup/cli/dependencies' autoload :Dependencies, 'gitlab/backup/cli/dependencies'
autoload :BackupMetadata, 'gitlab/backup/cli/backup_metadata' autoload :BackupMetadata, 'gitlab/backup/cli/backup_metadata'
autoload :Metadata, 'gitlab/backup/cli/metadata'
autoload :Output, 'gitlab/backup/cli/output' autoload :Output, 'gitlab/backup/cli/output'
autoload :Runner, 'gitlab/backup/cli/runner' autoload :Runner, 'gitlab/backup/cli/runner'
autoload :SourceContext, 'gitlab/backup/cli/source_context' autoload :SourceContext, 'gitlab/backup/cli/source_context'
......
...@@ -5,9 +5,6 @@ module Backup ...@@ -5,9 +5,6 @@ module Backup
module Cli module Cli
# Backup Metadata includes information about the Backup # Backup Metadata includes information about the Backup
class BackupMetadata class BackupMetadata
extend Utils::MetadataSerialization
include Utils::MetadataSerialization
# Metadata version number should always increase when: # Metadata version number should always increase when:
# - field is added # - field is added
# - field is removed # - field is removed
...@@ -88,11 +85,12 @@ def self.load!(basepath) ...@@ -88,11 +85,12 @@ def self.load!(basepath)
json_file = basepath.join(METADATA_FILENAME) json_file = basepath.join(METADATA_FILENAME)
json = JSON.parse(File.read(json_file), JSON_PARSE_OPTIONS) json = JSON.parse(File.read(json_file), JSON_PARSE_OPTIONS)
deserializer = Gitlab::Backup::Cli::Metadata::Deserializer
parsed_fields = {} parsed_fields = {}
METADATA_SCHEMA.each do |key, data_type| METADATA_SCHEMA.each do |key, data_type|
stored_value = json[key] stored_value = json[key]
parsed_value = parse_value(type: data_type, value: stored_value) parsed_value = deserializer.parse_value(type: data_type, value: stored_value)
parsed_fields[key] = parsed_value parsed_fields[key] = parsed_value
end end
...@@ -107,10 +105,12 @@ def self.load!(basepath) ...@@ -107,10 +105,12 @@ def self.load!(basepath)
# Expose the information that will be part of the Metadata JSON file # Expose the information that will be part of the Metadata JSON file
def to_hash def to_hash
serializer = Gitlab::Backup::Cli::Metadata::Serializer
METADATA_SCHEMA.each_with_object({}) do |(key, type), hash| METADATA_SCHEMA.each_with_object({}) do |(key, type), hash|
# fetch attribute value dynamically # fetch attribute value dynamically
value = public_send(key) value = public_send(key)
serialized_value = serialize_value(type: type, value: value) serialized_value = serializer.serialize_value(type: type, value: value)
hash[key] = serialized_value hash[key] = serialized_value
end end
end end
......
# frozen_string_literal: true
module Gitlab
module Backup
module Cli
module Metadata
autoload :Serializer, 'gitlab/backup/cli/metadata/serializer'
autoload :Deserializer, 'gitlab/backup/cli/metadata/deserializer'
end
end
end
end
# frozen_string_literal: true
module Gitlab
module Backup
module Cli
module Metadata
module Deserializer
extend self
# Given a JSON primitive +value+ loaded from a file, cast it to the
# expected class as specified by +type+
#
# @param [Symbol] type
# @param [Object] value
# @return [Object] the parsed and converted value
def parse_value(type:, value:)
return value if value.nil?
case type
when :string then parse_string(value)
when :time then parse_time(value)
when :integer then parse_integer(value)
else
raise NameError, "Unknown data type key #{type.inspect} provided when parsing backup metadata"
end
end
# @param [Object] value
def parse_string(value)
value.to_s
end
def parse_time(value)
return value if value.is_a?(Time) || value.nil?
Time.parse(value.to_s)
end
def parse_integer(value)
return value if value.is_a?(Integer) || value.nil?
value.to_s.to_i
end
end
end
end
end
end
...@@ -3,28 +3,10 @@ ...@@ -3,28 +3,10 @@
module Gitlab module Gitlab
module Backup module Backup
module Cli module Cli
module Utils module Metadata
# Defines value parsing and formatting routines for backup metadata JSON # Defines value parsing and formatting routines for backup metadata JSON
module MetadataSerialization module Serializer
module_function extend self
# Given a JSON primitive +value+ loaded from a file, cast it to the
# expected class as specified by +type+
#
# @param [Symbol] type
# @param [Object] value
# @return [Object] the parsed and converted value
def parse_value(type:, value:)
return value if value.nil?
case type
when :string then parse_string(value)
when :time then parse_time(value)
when :integer then parse_integer(value)
else
fail NameError, "Unknown data type key #{type.inspect} provided when parsing backup metadata"
end
end
# Given a metadata value, prepare and format the value as a # Given a metadata value, prepare and format the value as a
# JSON primitive type before serializing # JSON primitive type before serializing
...@@ -40,28 +22,13 @@ def serialize_value(type:, value:) ...@@ -40,28 +22,13 @@ def serialize_value(type:, value:)
when :time then serialize_time(value) when :time then serialize_time(value)
when :integer then serialize_integer(value) when :integer then serialize_integer(value)
else else
fail NameError, "Unknown data type key #{type.inspect} provided when serializing backup metadata" raise NameError, "Unknown data type key #{type.inspect} provided when serializing backup metadata"
end end
end end
def parse_string(value)
return value if value.nil?
value.to_s
end
def parse_time(value)
return value if value.is_a?(Time) || value.nil?
Time.parse(value.to_s)
end
def parse_integer(value)
return value if value.is_a?(Integer) || value.nil?
value.to_s.to_i
end
def serialize_integer(value) def serialize_integer(value)
return value if value.nil? return value if value.nil?
value.to_i value.to_i
end end
...@@ -70,9 +37,10 @@ def serialize_string(value) ...@@ -70,9 +37,10 @@ def serialize_string(value)
end end
def serialize_time(value) def serialize_time(value)
raise ArgumentError unless value.is_a?(Time)
# ensures string values and nil are properly cast to Time objects # ensures string values and nil are properly cast to Time objects
time = parse_time(value) value.iso8601
time&.iso8601
end end
end end
end end
......
0% 加载中 .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册