Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add serializers for Dates, Integers and Floats #6

Merged
merged 1 commit into from
Oct 8, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 16 additions & 10 deletions lib/vault/rails.rb
Original file line number Diff line number Diff line change
@@ -1,21 +1,27 @@
require "vault"
require 'vault'

require "base64"
require "json"
require 'base64'
require 'json'

require_relative "encrypted_model"
require_relative "rails/configurable"
require_relative "rails/errors"
require_relative "rails/serializer"
require_relative "rails/version"
require_relative 'encrypted_model'
require_relative 'rails/configurable'
require_relative 'rails/errors'
require_relative 'rails/serializers/json_serializer'
require_relative 'rails/serializers/date_serializer'
require_relative 'rails/serializers/integer_serializer'
require_relative 'rails/serializers/float_serializer'
require_relative 'rails/version'

module Vault
module Rails
# The list of serializers.
#
# @return [Hash<Symbol, Module>]
SERIALIZERS = {
json: Vault::Rails::JSONSerializer,
json: Vault::Rails::Serializers::JSONSerializer,
date: Vault::Rails::Serializers::DateSerializer,
integer: Vault::Rails::Serializers::IntegerSerializer,
float: Vault::Rails::Serializers::FloatSerializer
}.freeze

# The default encoding.
Expand Down Expand Up @@ -136,7 +142,7 @@ def serializer_for(key)
if serializer = SERIALIZERS[key]
return serializer
else
raise Vault::Rails::UnknownSerializerError.new(key)
raise Vault::Rails::Serializers::UnknownSerializerError.new(key)
end
end

Expand Down
17 changes: 9 additions & 8 deletions lib/vault/rails/errors.rb
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
module Vault
module Rails
class VaultRailsError < RuntimeError; end
class ValidationFailedError < VaultRailsError; end

class UnknownSerializerError < VaultRailsError
def initialize(key)
super <<-EOH
Unknown Vault serializer `:#{key}'. Valid serializers are:
module Serializers
class UnknownSerializerError < VaultRailsError
def initialize(key)
super <<-EOH
Unknown Vault serializer `:#{key}`. Valid serializers are:

#{SERIALIZERS.keys.sort.map(&:inspect).join(", ")}
#{SERIALIZERS.keys.sort.map(&:inspect).join(", ")}

Please refer to the documentation for more examples.
EOH
EOH
end
end
end

class ValidationFailedError < VaultRailsError; end
end
end
33 changes: 0 additions & 33 deletions lib/vault/rails/serializer.rb

This file was deleted.

22 changes: 22 additions & 0 deletions lib/vault/rails/serializers/date_serializer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
module Vault
module Rails
module Serializers
# Converts date objects to and from ISO 8601 format (%F)
module DateSerializer
module_function

def encode(raw)
return nil if raw.blank?

raw = Date.parse(raw) if raw.is_a? String
raw.strftime('%F')
end

def decode(raw)
return nil if raw.blank?
Date.strptime(raw, '%F')
end
end
end
end
end
21 changes: 21 additions & 0 deletions lib/vault/rails/serializers/float_serializer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
module Vault
module Rails
module Serializers
module FloatSerializer
module_function

def encode(raw)
return nil if raw.blank?
raw.to_s
end

def decode(raw)
return nil if raw.blank?
raw.to_f
end
end
end
end
end


19 changes: 19 additions & 0 deletions lib/vault/rails/serializers/integer_serializer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
module Vault
module Rails
module Serializers
module IntegerSerializer
module_function

def encode(raw)
return nil if raw.blank?
raw.to_s
end

def decode(raw)
return nil if raw.blank?
raw.to_i
end
end
end
end
end
35 changes: 35 additions & 0 deletions lib/vault/rails/serializers/json_serializer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
module Vault
module Rails
module Serializers
module JSONSerializer
DECODE_OPTIONS = {
max_nested: false,
create_additions: false,
}.freeze

def self.encode(raw)
self._init!

raw = {} if raw.nil?

JSON.fast_generate(raw)
end

def self.decode(raw)
self._init!

return {} if raw.nil? || raw.empty?
JSON.parse(raw, DECODE_OPTIONS)
end

protected

def self._init!
return if defined?(@_init)
require "json"
@_init = true
end
end
end
end
end
12 changes: 12 additions & 0 deletions spec/unit/rails/serializers/date_serializer_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
require 'spec_helper'

describe Vault::Rails::Serializers::DateSerializer do
it 'encodes values to strings' do
expect(subject.encode(Date.new(1999, 1, 1))). to eq '1999-01-01'
end

it 'decodes values from strings' do
expect(subject.decode('1999-12-31')). to eq Date.new(1999, 12, 31)
end
end

15 changes: 15 additions & 0 deletions spec/unit/rails/serializers/float_serializer_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
require 'spec_helper'

describe Vault::Rails::Serializers::FloatSerializer do
it 'encodes values to strings' do
expect(subject.encode(1.0)). to eq '1.0'
expect(subject.encode(42.00001)). to eq '42.00001'
expect(subject.encode(435345.40035)). to eq '435345.40035'
end

it 'decodes values from strings' do
expect(subject.decode('1.0')). to eq 1.0
expect(subject.decode('42')). to eq 42.0
expect(subject.decode('435345.40035')). to eq 435345.40035
end
end
15 changes: 15 additions & 0 deletions spec/unit/rails/serializers/integer_serializer_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
require 'spec_helper'

describe Vault::Rails::Serializers::IntegerSerializer do
it 'encodes values to strings' do
expect(subject.encode(1)). to eq '1'
expect(subject.encode(42)). to eq '42'
expect(subject.encode(23425)). to eq '23425'
end

it 'decodes values from strings' do
expect(subject.decode('1')). to eq 1
expect(subject.decode('42')). to eq 42
expect(subject.decode('23425')). to eq 23425
end
end
20 changes: 10 additions & 10 deletions spec/unit/rails_spec.rb
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
require "spec_helper"
require 'spec_helper'

describe Vault::Rails do
describe ".serializer_for" do
it "accepts a string" do
serializer = Vault::Rails.serializer_for("json")
expect(serializer).to be(Vault::Rails::JSONSerializer)
describe '.serializer_for' do
it 'accepts a string' do
serializer = Vault::Rails.serializer_for('json')
expect(serializer).to be(Vault::Rails::Serializers::JSONSerializer)
end

it "accepts a symbol" do
it 'accepts a symbol' do
serializer = Vault::Rails.serializer_for(:json)
expect(serializer).to be(Vault::Rails::JSONSerializer)
expect(serializer).to be(Vault::Rails::Serializers::JSONSerializer)
end

it "raises an exception when there is no serializer for the key" do
it 'raises an exception when there is no serializer for the key' do
expect {
Vault::Rails.serializer_for(:not_a_serializer)
}.to raise_error(Vault::Rails::UnknownSerializerError) { |e|
expect(e.message).to match("Unknown Vault serializer `:not_a_serializer'")
}.to raise_error(Vault::Rails::Serializers::UnknownSerializerError) { |e|
expect(e.message).to match('Unknown Vault serializer `:not_a_serializer`')
}
end
end
Expand Down