-
Notifications
You must be signed in to change notification settings - Fork 202
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add ability to define custom data types (#235)
* move attributes converting into separate files * remove redundant file import * move saving inside field * fix initialization * fix styles * add ability to serialize and deserialize fields separately * add test for custom item
- Loading branch information
Showing
13 changed files
with
242 additions
and
93 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,21 @@ | ||
# frozen_string_literal: true | ||
|
||
require_relative "rails-settings/fields/base" | ||
require_relative "rails-settings/fields/array" | ||
require_relative "rails-settings/fields/big_decimal" | ||
require_relative "rails-settings/fields/boolean" | ||
require_relative "rails-settings/fields/float" | ||
require_relative "rails-settings/fields/hash" | ||
require_relative "rails-settings/fields/integer" | ||
require_relative "rails-settings/fields/string" | ||
|
||
require_relative "rails-settings/base" | ||
require_relative "rails-settings/request_cache" | ||
require_relative "rails-settings/middleware" | ||
require_relative "rails-settings/railtie" | ||
require_relative "rails-settings/version" | ||
|
||
module RailsSettings | ||
module Fields | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
module RailsSettings | ||
module Fields | ||
class Array < ::RailsSettings::Fields::Base | ||
def deserialize(value) | ||
return value unless value.is_a?(::String) | ||
|
||
value.split(separator).reject(&:empty?).map(&:strip) | ||
end | ||
|
||
def serialize(value) | ||
deserialize(value) | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
module RailsSettings | ||
module Fields | ||
class Base < Struct.new(:scope, :key, :default, :parent, :readonly, :separator, :type, :options, keyword_init: true) | ||
SEPARATOR_REGEXP = /[\n,;]+/ | ||
|
||
def initialize(scope:, key:, default:, parent:, readonly:, separator:, type:, options:) | ||
super | ||
self.readonly = !!readonly | ||
self.type ||= :string | ||
self.separator ||= SEPARATOR_REGEXP | ||
end | ||
|
||
def save!(value:) | ||
serialized_value = serialize(value) | ||
parent_record = parent.find_by(var: key) || parent.new(var: key) | ||
parent_record.value = serialized_value | ||
parent_record.save! | ||
parent_record.value | ||
end | ||
|
||
def saved_value | ||
return parent.send(:_all_settings)[key] if table_exists? | ||
|
||
# Fallback to default value if table was not ready (before migrate) | ||
puts "WARNING: table: \"#{parent.table_name}\" does not exist or not database connection, `#{parent.name}.#{key}` fallback to returns the default value." | ||
nil | ||
end | ||
|
||
def default_value | ||
default.is_a?(Proc) ? default.call : default | ||
end | ||
|
||
def read | ||
return deserialize(default_value) if readonly || saved_value.nil? | ||
|
||
deserialize(saved_value) | ||
end | ||
|
||
def deserialize(value) | ||
raise NotImplementedError | ||
end | ||
|
||
def serialize(value) | ||
raise NotImplementedError | ||
end | ||
|
||
def to_h | ||
super.slice(:scope, :key, :default, :type, :readonly, :options) | ||
end | ||
|
||
def table_exists? | ||
parent.table_exists? | ||
rescue StandardError | ||
false | ||
end | ||
|
||
class << self | ||
def generate(**args) | ||
fetch_field_class(args[:type]).new(**args) | ||
end | ||
|
||
private | ||
|
||
def fetch_field_class(type) | ||
field_class_name = type.to_s.split('_').map(&:capitalize).join('') | ||
const_get("::RailsSettings::Fields::#{field_class_name}") | ||
end | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
module RailsSettings | ||
module Fields | ||
class BigDecimal < ::RailsSettings::Fields::Base | ||
def deserialize(value) | ||
value.to_d | ||
end | ||
|
||
def serialize(value) | ||
deserialize(value) | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
module RailsSettings | ||
module Fields | ||
class Boolean < ::RailsSettings::Fields::Base | ||
def deserialize(value) | ||
["true", "1", 1, true].include?(value) | ||
end | ||
|
||
def serialize(value) | ||
deserialize(value) | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
module RailsSettings | ||
module Fields | ||
class Float < ::RailsSettings::Fields::Base | ||
def deserialize(value) | ||
value.to_f | ||
end | ||
|
||
def serialize(value) | ||
deserialize(value) | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
module RailsSettings | ||
module Fields | ||
class Hash < ::RailsSettings::Fields::Base | ||
def deserialize(value) | ||
return value unless value.is_a?(::String) | ||
|
||
load_value(value).deep_stringify_keys.with_indifferent_access | ||
end | ||
|
||
def serialize(value) | ||
deserialize(value) | ||
end | ||
|
||
def load_value(value) | ||
YAML.safe_load(value).to_h | ||
rescue StandardError | ||
{} | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
module RailsSettings | ||
module Fields | ||
class Integer < ::RailsSettings::Fields::Base | ||
def deserialize(value) | ||
value.to_i | ||
end | ||
|
||
def serialize(value) | ||
deserialize(value) | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
module RailsSettings | ||
module Fields | ||
class String < ::RailsSettings::Fields::Base | ||
def deserialize(value) | ||
value | ||
end | ||
|
||
def serialize(value) | ||
deserialize(value) | ||
end | ||
end | ||
end | ||
end |
Oops, something went wrong.