From 870b26c2f2f80a04fe905a7cc8e859c8eee50e70 Mon Sep 17 00:00:00 2001 From: Adam Cooke Date: Wed, 21 Feb 2024 21:10:11 +0000 Subject: [PATCH] refactor: move Postal::QueryString to app/util/query_string --- app/controllers/messages_controller.rb | 2 +- app/util/query_string.rb | 36 +++++++++++++++++++++ lib/postal/query_string.rb | 38 ---------------------- spec/lib/postal/query_string_spec.rb | 44 -------------------------- spec/util/query_string_spec.rb | 44 ++++++++++++++++++++++++++ 5 files changed, 81 insertions(+), 83 deletions(-) create mode 100644 app/util/query_string.rb delete mode 100644 lib/postal/query_string.rb delete mode 100644 spec/lib/postal/query_string_spec.rb create mode 100644 spec/util/query_string_spec.rb diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb index c028cdb..2e6a25d 100644 --- a/app/controllers/messages_controller.rb +++ b/app/controllers/messages_controller.rb @@ -161,7 +161,7 @@ class MessagesController < ApplicationController if @query = (params[:query] || session["msg_query_#{@server.id}_#{scope}"]).presence session["msg_query_#{@server.id}_#{scope}"] = @query - qs = Postal::QueryString.new(@query) + qs = QueryString.new(@query) if qs.empty? flash.now[:alert] = "It doesn't appear you entered anything to filter on. Please double check your query." else diff --git a/app/util/query_string.rb b/app/util/query_string.rb new file mode 100644 index 0000000..b2c9de3 --- /dev/null +++ b/app/util/query_string.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +class QueryString + + def initialize(string) + @string = string.strip + " " + end + + def [](value) + hash[value.to_s] + end + + delegate :empty?, to: :hash + + def hash + @hash ||= @string.scan(/([a-z]+):\s*(?:(\d{2,4}-\d{2}-\d{2}\s\d{2}:\d{2})|"(.*?)"|(.*?))(\s|\z)/).each_with_object({}) do |(key, date, string_with_spaces, value), hash| + if date + actual_value = date + elsif string_with_spaces + actual_value = string_with_spaces + elsif value == "[blank]" + actual_value = nil + else + actual_value = value + end + + if hash.keys.include?(key.to_s) + hash[key.to_s] = [hash[key.to_s]].flatten + hash[key.to_s] << actual_value + else + hash[key.to_s] = actual_value + end + end + end + +end diff --git a/lib/postal/query_string.rb b/lib/postal/query_string.rb deleted file mode 100644 index 3ca28c0..0000000 --- a/lib/postal/query_string.rb +++ /dev/null @@ -1,38 +0,0 @@ -# frozen_string_literal: true - -module Postal - class QueryString - - def initialize(string) - @string = string.strip + " " - end - - def [](value) - hash[value.to_s] - end - - delegate :empty?, to: :hash - - def hash - @hash ||= @string.scan(/([a-z]+):\s*(?:(\d{2,4}-\d{2}-\d{2}\s\d{2}:\d{2})|"(.*?)"|(.*?))(\s|\z)/).each_with_object({}) do |(key, date, string_with_spaces, value), hash| - if date - actual_value = date - elsif string_with_spaces - actual_value = string_with_spaces - elsif value == "[blank]" - actual_value = nil - else - actual_value = value - end - - if hash.keys.include?(key.to_s) - hash[key.to_s] = [hash[key.to_s]].flatten - hash[key.to_s] << actual_value - else - hash[key.to_s] = actual_value - end - end - end - - end -end diff --git a/spec/lib/postal/query_string_spec.rb b/spec/lib/postal/query_string_spec.rb deleted file mode 100644 index 6be6283..0000000 --- a/spec/lib/postal/query_string_spec.rb +++ /dev/null @@ -1,44 +0,0 @@ -# frozen_string_literal: true - -require "rails_helper" - -describe Postal::QueryString do - it "should work with a single item" do - qs = Postal::QueryString.new("to: test@example.com") - expect(qs.hash["to"]).to eq "test@example.com" - end - - it "should work with a multiple items" do - qs = Postal::QueryString.new("to: test@example.com from: another@example.com") - expect(qs.hash["to"]).to eq "test@example.com" - expect(qs.hash["from"]).to eq "another@example.com" - end - - it "should not require a space after the field name" do - qs = Postal::QueryString.new("to:test@example.com from:another@example.com") - expect(qs.hash["to"]).to eq "test@example.com" - expect(qs.hash["from"]).to eq "another@example.com" - end - - it "should return nil when it receives blank" do - qs = Postal::QueryString.new("to:[blank]") - expect(qs.hash["to"]).to eq nil - end - - it "should handle dates with spaces" do - qs = Postal::QueryString.new("date: 2017-02-12 15:20") - expect(qs.hash["date"]).to eq("2017-02-12 15:20") - end - - it "should return an array for multiple items" do - qs = Postal::QueryString.new("to: test@example.com to: another@example.com") - expect(qs.hash["to"]).to be_a(Array) - expect(qs.hash["to"][0]).to eq "test@example.com" - expect(qs.hash["to"][1]).to eq "another@example.com" - end - - it "should work with a z in the string" do - qs = Postal::QueryString.new("to: testaz@example.com") - expect(qs.hash["to"]).to eq "testaz@example.com" - end -end diff --git a/spec/util/query_string_spec.rb b/spec/util/query_string_spec.rb new file mode 100644 index 0000000..2233b04 --- /dev/null +++ b/spec/util/query_string_spec.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +require "rails_helper" + +describe QueryString do + it "works with a single item" do + qs = described_class.new("to: test@example.com") + expect(qs.hash["to"]).to eq "test@example.com" + end + + it "works with a multiple items" do + qs = described_class.new("to: test@example.com from: another@example.com") + expect(qs.hash["to"]).to eq "test@example.com" + expect(qs.hash["from"]).to eq "another@example.com" + end + + it "does not require a space after the field name" do + qs = described_class.new("to:test@example.com from:another@example.com") + expect(qs.hash["to"]).to eq "test@example.com" + expect(qs.hash["from"]).to eq "another@example.com" + end + + it "returns nil when it receives blank" do + qs = described_class.new("to:[blank]") + expect(qs.hash["to"]).to eq nil + end + + it "handles dates with spaces" do + qs = described_class.new("date: 2017-02-12 15:20") + expect(qs.hash["date"]).to eq("2017-02-12 15:20") + end + + it "returns an array for multiple items" do + qs = described_class.new("to: test@example.com to: another@example.com") + expect(qs.hash["to"]).to be_a(Array) + expect(qs.hash["to"][0]).to eq "test@example.com" + expect(qs.hash["to"][1]).to eq "another@example.com" + end + + it "works with a z in the string" do + qs = described_class.new("to: testaz@example.com") + expect(qs.hash["to"]).to eq "testaz@example.com" + end +end